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

컬렉션이 비었을 경우 null을 반환

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

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

컬렉션이나 배열 같은 컨테이너가 비었을 때 null을 반환하는 메서드를 사용할 때면 항시 방어 코드를 넣어줘야 한다. 클라이언트에서 방어 코드를 빼먹으면 오류가 발생할 수 있다. null을 반환하려면 반환하는 쪽에서도 이 상황을 특별히 취급해줘야 해서 코드가 더 복잡해진다.

빈 컬렉션을 반환

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

사용 패턴에 따라 빈 컬렉션 할당이 성능을 눈에 띄게 떨어뜨릴 수 있다. 이 경우 매번 똑같은 빈 ‘불변’ 컬렉션을 반환하면 된다.

최적화 - 빈 불변 컬렉션을 반환

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

빈 배열을 반환

배열을 쓸 때도 null을 반환하지 말고 길이가 0인 배열을 반환하자.

public Cheese[] getCheeses() {
    return cheesesInStock.toArray(new Cheese[0]);
}

toArray 메서드에 건넨 길이 0짜리 배열은 우리가 원하는 반환 타입(Cheese[])을 알려주는 역할을 한다. 이 방식이 성능을 떨어뜨릴 것 같다면 길이 0짜리 배열을 미리 선언해두고 매번 그 배열을 반환하면 된다.

최적화 - 빈 배열을 미리 생성 후 반환

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

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

null이 아닌, 빈 배열이나 컬렉션을 반환하자. null을 반환하는 API는 사용하기 어렵고 오류 처리 코드도 늘어난다. 그렇다고 성능이 좋은 것도 아니다.

Comments