private final List<Cheese> cheeseInStock = ...;
public List<Cheese> getCheeses() {
return cheeseInStock.isEmpty() ? null : new ArrayList<>(cheeseInStock);
}
// null 처리
List<Cheese> cheeses = shop.getCheeses();
if (cheeses != null && chess.contains(Chess.STILTON) {
...
}
null
을 반환한다.Q. 빈 컨테이너를 할당하는 건 비용이 들텐데, null을 반환하는 게 더 낫지 않을까?
2가지 측면에서 그렇지 않다.
- 성능 분석 결과, 이러한 할당으로 인한 성능 차이는 신경 쓸 수준이 못 된다.
- 빈 컬렉션과 배열은 굳이 새로 할당하지 않고도 반환할 수 있다.
public List<Cheese> getCheeses() {
return new ArrayList<>(cheeseInStock);
}
public List<Cheese> getCheeses() {
return cheeseInStock.isEmpty() ? Collections.emptyList()
: new ArrayList<>(cheeseInStock);
}
가능성은 낮지만 빈 컬렉션 할당이 성능을 떨어뜨린다면, 빈 불변 컬렉션
을 반환하자.
(불변 객체는 공유해도 안전하다.)
Collections.emptyList()
Collections.emptySet()
Collections.emptyMap()
public List<Cheese> getCheeses() {
return new cheeseInStock.toArray(new Cheese[0]);
}
private static final Cheese[0] EMPTY_CHEESE_ARRAY = new Cheese[0];
public Cheese[] getCheeses() {
return EMPTY_CHEESE_ARRAY;
}
🔖 핵심 정리
null이 아닌, 빈 배열이나 컬렉션을 반환하라.
null을 반환하는 API는 사용하기 어렵고 오류 처리 코드도 늘어난다.
그렇다고 성능이 좋은 것도 아니다.