Skip to content

Latest commit

 

History

History
64 lines (45 loc) · 1.81 KB

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

File metadata and controls

64 lines (45 loc) · 1.81 KB

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

null을 반환하면 안되는 이유

  • 클라이언트가 null 처리 코드를 추가해야한다.

아래처럼 null을 반환한다면...

private final List<Cheese> cheesesInStock = ...;

public List<Cheese> getCheeses() {
    return cheesesInStock.isEmpty() ? null : new ArrayList<cheesesInStock>;     
}

클라이언트에서 null 체크를 해주어야한다.

List<Cheese> cheeses = shop.getCheeses();
if (cheeses != null) {
    ...
}

빈 컬렉션(혹은 배열) 반환에 대한 오해

🧨 오해: 빈 컨테이너를 할당하는데 비용이 들기 때문에 null을 반환하는 것이 낫다.

반박

  • 대부분의 경우 신경 쓸만한 성능 차이를 보이지 않는다.
  • 최적화를 할 수 있는 방법이 있다.

전형적인 빈 컬렉션을 반환하는 예시

public List<Cheese> getCheeses() {
        return new ArrayList<>(cheesesInStock);
}

대부분의 경우 최적화를 하지 않아도 된다. 성능 저하가 일어난다는 것을 확신할 수 있다면(아이템 67) 아래처럼 최적화가 가능하다.

jdk 1.5에 추가된 Collections.emptyList()는 빈 불변 리스트를 반환한다.

빈 컬렉션 반환 최적화(매번 빈 배열을 새로 할당하지 않아도 된다.)

public List<Cheese> getCheeses() {
    return cheeseInStock.isEmpty() ? Collections.emptyList() : new ArrayList<>(cheesesInStock);    
}

빈 배열 반환 최적화

private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];

public Cheese[] getCheese() {
    return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);
}

정리

null을 반환하지 말고 빈 컨테이너를 반환하라. 최적화가 필요하다고 확신하면 최적화하여 빈 컨테이너를 반환하라.