public List getCheeses() {
return cheeseInStock.isEmpty()? null : new ArrayList<>(cheeseInStock);
}
### 빈 컨테이너를 할당하는 데도 비용이 드니 null을 반환하는 쪽이 낫다는 주장은 틀린 주장이다.
1. 성능 분석 결과 이 항당이 성능 저하의 주범이라고 확인되지 않는 한(#67) 이 정도의 성능 차이는 신경 쓸 수준이 못된다.
2. 빈 컬렉션과 배열은 굳이 새로 할당하지 않고도 반환할 수 있다.
### 빈 컬렉션을 반환하는 올바른 예
~~~java
private final List<Cheese> cheeseInStock = null;
public List<Cheese> getCheeses() {
return new ArrayList<>(cheeseInStock);
}
사용 패턴에 따라 빈 컬렉션 할당이 성능을 눈에 띄게 떨어 뜨릴 수도 있다. (가능성이 적다)
매번 똑같은 빈 "불변" 컬렉션을 반환하는 것이다.
불편 객체는 자유롭게 공유해도 안전하다. (#17)
Collections.emptyList
집합 : Collections.emptySet
맵 : Collections.emptyMap
단, 최적화에 해당하니 꼭 필요할 때만 사용하자. 성능 측정을 통해 실제로 개선되었는지 확인 필요
public List<Cheese> getCheeses() {
return cheeseInStock.isEmpty()? Collections.emptyList() : new ArrayList<>(cheeseInStock);
}
Array
길이가 0인 배열을 반환. 단순히 정확한 길이의 배열을 반환하기만 하면 된다.
public Cheese[] getCheeses() {
return cheeseInStock.toArray(new Cheese[0]);
}
성능을 떨어뜨릴 것 같다면 미리 선언하고 매번 그 배열을 반환한다.
private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];
public Cheese[] getCheeses() {
return cheeseInStock.toArray(EMPTY_CHEESE_ARRAY);
}
## 핵심 정리
> null이 아닌, 빈 배열이나 컬렉션을 반환하라.
> null을 반환하는 API는 사용하기 어렵고 오류 처리 코드도 늘어난다. 그렇다고 성능이 좋은 것도 아니다.
컬렉션이 비었으면 null을 반환한다.
public List getCheeses() {
return cheeseInStock.isEmpty()? null : new ArrayList<>(cheeseInStock);
}
사용 패턴에 따라 빈 컬렉션 할당이 성능을 눈에 띄게 떨어 뜨릴 수도 있다. (가능성이 적다)
Collections.emptyList
Array
public Cheese[] getCheeses() { return cheeseInStock.toArray(EMPTY_CHEESE_ARRAY); }