null이 아닌, 빈 컬렉션이나 배열을 반환하라
컬렉션이 비었다면 null을 반환하는 것을 흔히 볼 수 있다고 한다. (난 그런 적 없는데..) 만약 null을 반환한다면, 클라이언트는 null 상황을 처리하는 코드를 추가로 작성해야 한다.
빈 컨테이너를 할당하는 데도 비용이 드니 null을 반환하는 쪽이 낫다는 주장이 틀린 이유는 다음과 같다.
public List<Cheese> getCheeses() {
return cheesesInStock.isEmpty() ? Collections.emptyList() : new ArrayList<>(cheesesInStock);
}
위와 같이 작성하면 매번 똑같은 빈 Collections.emptyList()
과 같이 '불변'컬렉션을 반환하면 된다.
배열도 마찬가지로, null을 반환하지 말고 길이가 0인 배열을 반환하면 된다.
public Cheese[] getCheeses() {
return cheesesInStock.toArray(new Cheese[0]);
}
위 방식이 성능을 떨어뜨릴 것 같다면, 길이 0짜리 배열을 미리 선언해두고 매번 그 배열을 반환하면 된다.
private static final Chesse[] EMPTY_CHEESE_ARRAY = new Cheese[0];
public Cheese[] getCheeses() {
return cheesesInstock.toArray(EMPTY_CHEESE_ARRAY);
}
toArray(a)는 주어진 배열 a가 충분히 크면 a 안에 원소를 담아 반환하고, 그렇지 않으면 새로 배열을 만드므로 위 코드는 원소가 0이면 미리 할당한 배열을 반환한다.