컬렉션이 비어 있을 경우 null을 리턴하기도 한다.
그 예시로
private final List<Example> exampleList = ...;
public List<Example> getExample() {
return exampleList.isEmpty() ? null : new ArrayList<>(exampleList);
}
이렇게 사용을 하기도 하는데, 이렇게 할 경우 리턴 받는 쪽에서 null을 처리하는 코드를 추가로 작성해야 한다.
혹시나 null 처리 코드가 없을 경우 에러가 발생할 확률이 높다.
이를 방지하기 위해서는
public List<Example> getExample() {
return new ArrayList<>(exampleList);
}
이렇게만 해주면 null처리 코드가 없어도 에러가 발생할 확률을 낮출 수 있다.
하지만 이렇게 할 경우 성능 저하가 있을 수 있기 때문에,
public List<Example> getExample() {
return exampleList.isEmpty() ? Collections.emptyList() : new ArrayList<>(exampleList);
}
매번 빈 컬렉션을 리턴하면 성능 저하를 막을 수있다. (Map일 경우 Collections.emptyMap() 사용)
배열도 마찬가지로,
public Example[] getExample() {
return exampleList.toArray(new Example[0]);
}
// 성능 저하 방지
private static final Example[] EMPTY_EXAPLE_ARRAY = new Example[0];
public Example[] getExample() {
return exampleList.toArray(EMPTY_EXAPLE_ARRAY);
}
- 핵심 정리
null이 아닌, 빈 배열이나 컬렉션을 반환할 것. null을 반환하는 API는 번거롭다. 성능이 좋은 것도 아니다.
- ChatGPT 답변
1. Null 포인터 예외 방지: Null 값을 반환하면 클라이언트 코드에서 Null 포인터 예외(NullPointerException)가 발생할 수 있다. 이는 프로그램의 안정성과 신뢰성을 저하시킬 수 있다. 빈 컬렉션 또는 배열을 반환하면 클라이언트 코드에서 추가적인 Null 체크를 할 필요가 없어지므로 예외가 발생할 가능성을 줄일 수 있다.
2. 코드 간결성과 가독성: 빈 컬렉션 또는 배열을 반환하면 클라이언트 코드에서 추가적인 Null 체크와 예외 처리를 할 필요가 없어지므로 코드가 더 간결하고 가독성이 좋아진다. Null을 처리하는 논리가 코드 여기저기 흩어지지 않고 한 곳에서 처리되므로 유지 보수성도 향상된다.
3. 안전한 연산 가능: Null을 반환하는 경우 클라이언트 코드에서 Null 값을 사용하려고 하면 예외가 발생한다. 반면에 빈 컬렉션 또는 배열을 반환하면 클라이언트 코드에서 안전하게 반복문 또는 다른 작업을 수행할 수 있다. 이를 통해 예기치 않은 예외 상황을 방지하고 안전한 연산을 가능하게 한다.
4. 일관성 유지: 메서드가 항상 빈 컬렉션 또는 배열을 반환한다면 클라이언트 코드는 항상 빈 컬렉션 또는 배열을 받을 것으로 예상할 수 있다. 이는 코드의 일관성을 유지하고 클라이언트 코드의 복잡성을 줄여준다.
따라서 Null 대신 빈 컬렉션 또는 배열을 반환하는 것은 프로그램의 안정성, 가독성, 유지 보수성을 향상시키는 좋은 프로그래밍 관행이다. 그러나 이는 상황에 따라 다를 수 있으므로 개발자는 각각의 상황과 요구사항에 맞게 적절한 방식을 선택해야 한다.
위에서 예시를 든 것을 길게 글로 표현한거 같다.
내 설명과 코드는 모두 이펙티브 자바를 참고했다.
'개발 > Java&Kotlin' 카테고리의 다른 글
[Java] 자바로 테스트 코드 작성 순서 알아보기 (0) | 2023.07.24 |
---|---|
[Java] 자바로 TDD 시작하기 (1) | 2023.07.20 |
[Java] Stream 사용 시 주의 사항 (0) | 2023.06.14 |
[Java] Array보다 List를 사용해야하는 이유 (0) | 2023.06.13 |
[Spring] @Modelattribute, @RequestBody 차이점 (1) | 2023.04.26 |