요약
•
컬렉션이나 배열을 반환할 때, 내부 요소가 없다면 null이 아니라 빈 컬렉션이나 빈 배열을 반환하자.
컬렉션이 비어있어도 특별 취급 금지
class Shop {
private final List<Cheese> cheesesInStock = ...;
public List<Cheese> getCheeses() {
return cheesesInStock.empty() ? null : new ArrayList<>(cheesesInStock);
}
}
Java
복사
•
위 예시와 같이 컬렉션이 비었을 때 null을 반환하는 코드를 작성하면,
List<Cheese> cheeses = shop.getCheeses();
if (cheeses != null && cheeses.contains(Cheese.STILTON))
System.out.println("좋았어, 바로 그거야.");
Java
복사
•
이처럼 null 이 반환될 경우를 고려하여 방어적 코드를 작성하지 않으면, 컬렉션이 비어있는 경우에 NullPointException이 발생한다.
•
또한 컬렉션을 반환하는 쪽에서도 null에 대한 반환값을 주기 위해 추가적인 로직이 필요하다.
public List<Cheese> getCheeses() {
return new ArrayList<>(cheesesInStock);
}
Java
복사
•
그러니 이와 같이 빈 컬렉션을 반환하도록 구현하자.
•
빈 컬렉션을 할당하는 것이 성능을 눈에 띄게 떨어뜨린다면 이와 같이 빈 불변 객체를 반환하게 작성하자.
public List<Cheese> getCheeses() {
return cheesesInStock.isEmpty() ? Collections.emptyList() : new ArrayList<>(cheesesInStock);
}
Java
복사
◦
다만 이러한 최적화는 꼭 필요할 때만 사용하고, 적용 이후 성능을 측정하여 실제로 개선 되는지 확인하자.
•
배열의 경우에도 null을 반환하지말고, 길이가 0인 배열을 반환하자.
public Cheese[] getCheeses() {
return cheesesInStock.toArray(new Cheese[0]);
}
Java
복사
•
배열에서도 마찬가지로 이 방법이 성능을 떨어뜨린다고 생각되면, 길이가 0인 빈 배열을 미리 만들어두고 반환하자.
private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];
public Cheese[] getCheeses() {
return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);
}
Java
복사