public List<Cheese> getCheeses() {
return cheesesInStock.isEmpty() ? null : new ArrayList<>(cheesesInStock);
}
창고에 저장된 치즈를 확인해서, 비어있다면 null을 리턴하고 그렇지 않다면 저장된 치즈가 담긴 새 리스트를 리턴
위 코드처럼 null을 반환할 경우, API 사용자는 null 처리 코드를 추가로 작성해야 함
public static void main(String[] args) {
Shop shop = new Shop();
List<Cheese> cheeses = shop.getCheeses();
if (cheeses != null && cheeses.contains(Cheese.STILTON))
System.out.println("Good!");
}
빈 컨테이너를 할당하는 데 비용이 드니 null을 반환하는 것이 낫다는 주장이 있지만 틀린 주장임
빈 컬렉션을 반환하는 올바른 예시
public List<Cheese> getCheeses() {
return new ArrayList<>(cheesesInStock);
}
빈 컬렉션을 매번 새로 할당하지 않도록 최적화하는 방법
public List<Cheese> getCheeses() {
return cheesesInStock.isEmpty() ? Collections.emptyList()
: new ArrayList<>(cheesesInStock);
}
빈 배열 또한 미리 선언해두고 사용할 수 있음
private final static Cheese [] EMPTY_CHEESE_ARRAY = new Cheese[0];
public Cheese[] getCheeses() {
return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);
}
EMPTY_CHEESE_ARRAY
를 인자로 전달하는 이유
→ 이 인자에 컬렉션의 크기에 맞는 새로운 배열을 할당하지 않고, 빈 배열을 제공하여 반환된 배열의 크기를 자동으로 조정하도록 하는 방식
빈 배열을 미리 할당하면 오히려 성능이 떨어질 수도 있으니 주의하자