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

wisdom·2022년 10월 5일
0

Effetctive Java

목록 보기
54/80
post-thumbnail

1. null 반환

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

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

// null 처리
List<Cheese> cheeses = shop.getCheeses();
if (cheeses != null && chess.contains(Chess.STILTON) {
    ...
}
  • 재고가 없는 경우, null 을 반환한다.
  • 그러나 재고가 없다고 해서 특별히 취급할 이유는 없으며, 클라이언트는 오히려 null 상황을 처리하는 코드를 추가로 작성해야 하는 번거로움이 있다.
  • 클라이언트에 null을 처리하는 방어 코드가 없으면 오류가 발생할 수 있다.

Q. 빈 컨테이너를 할당하는 건 비용이 들텐데, null을 반환하는 게 더 낫지 않을까?

2가지 측면에서 그렇지 않다.

  1. 성능 분석 결과, 이러한 할당으로 인한 성능 차이는 신경 쓸 수준이 못 된다.
  2. 빈 컬렉션과 배열은 굳이 새로 할당하지 않고도 반환할 수 있다.

2. 빈 컬렉션 반환

public List<Cheese> getCheeses() {
    return new ArrayList<>(cheeseInStock);
}
  • 빈 컬렉션을 반환하는 전형적인 예시
  • 대부분의 상황에서 이렇게 작성하면 된다.

최적화

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

가능성은 낮지만 빈 컬렉션 할당이 성능을 떨어뜨린다면, 빈 불변 컬렉션을 반환하자.
(불변 객체는 공유해도 안전하다.)

  • Collections.emptyList()
  • Collections.emptySet()
  • Collections.emptyMap()

3. 빈 배열 반환

public List<Cheese> getCheeses() {
    return new cheeseInStock.toArray(new Cheese[0]);
}
  • 단순하게 길이가 0일 배열을 반환하면 된다.

최적화

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

public Cheese[] getCheeses() {
    return EMPTY_CHEESE_ARRAY;
}
  • 길이가 0인 배열을 미리 선언해두고 그 배열을 반환하여 최적화한다.
  • 길이가 0인 배열은 모두 불변이기 때문에 가능하다.

🔖 핵심 정리

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

profile
백엔드 개발자

0개의 댓글