Search

Item 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라

생성일
2023/08/01 05:21
챕터
8장 - 메서드

요약

컬렉션이나 배열을 반환할 때, 내부 요소가 없다면 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
복사