- 클라이언트가 null 처리 코드를 추가해야한다.
아래처럼 null을 반환한다면...
private final List<Cheese> cheesesInStock = ...;
public List<Cheese> getCheeses() {
return cheesesInStock.isEmpty() ? null : new ArrayList<cheesesInStock>;
}
클라이언트에서 null 체크를 해주어야한다.
List<Cheese> cheeses = shop.getCheeses();
if (cheeses != null) {
...
}
🧨 오해: 빈 컨테이너를 할당하는데 비용이 들기 때문에 null을 반환하는 것이 낫다.
반박
- 대부분의 경우 신경 쓸만한 성능 차이를 보이지 않는다.
- 최적화를 할 수 있는 방법이 있다.
전형적인 빈 컬렉션을 반환하는 예시
public List<Cheese> getCheeses() {
return new ArrayList<>(cheesesInStock);
}
대부분의 경우 최적화를 하지 않아도 된다. 성능 저하가 일어난다는 것을 확신할 수 있다면(아이템 67) 아래처럼 최적화가 가능하다.
jdk 1.5에 추가된 Collections.emptyList()는 빈 불변 리스트를 반환한다.
빈 컬렉션 반환 최적화(매번 빈 배열을 새로 할당하지 않아도 된다.)
public List<Cheese> getCheeses() {
return cheeseInStock.isEmpty() ? Collections.emptyList() : new ArrayList<>(cheesesInStock);
}
빈 배열 반환 최적화
private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];
public Cheese[] getCheese() {
return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);
}
null을 반환하지 말고 빈 컨테이너를 반환하라. 최적화가 필요하다고 확신하면 최적화하여 빈 컨테이너를 반환하라.