Search

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

 null을 반환하면 발생할 수 있는 문제점

... public List<Cheese> getCheeses() { return cheesesInStock.isEmpty() ? null : new ArrayList<>(cheesesInStock); }
Java
List<Cheese> cheeses = shop.getCheeses(); if (cheeses != null && cheeses.contains(Cheese.STILTON)) { ... }
Java
클라이언트는 null에 대해 처리하는 코드를 추가로 작성해야 한다.
해당 메서드(getCheeses)를 사용할 때마다 같은 방어 코드를 넣어줘야 한다.
방어 코드가 빠지면 치명적인 오류가 발생할 수 있다.

 null을 반환하면 좋은 점이 있을까?

빈 컨테이너를 할당하는 것도 비용이라고 하는 주장도 있지만, 이는 틀린 주장이다.
할당하는 것이 성능 저하의 주범이라고 확인되지 않는 한, 이 정도의 성능 차이는 신경 쓸 수준이 못 된다.
그리고 빈 컬렉션과 배열은 새로 할당하지 않고도 반환할 수 있다.
ex) Collections.emptyList(), Collections.emptySet(), Collections.emptyMap()
//빈 컬렉션 반환 public List<Cheese> getCheeses() { return new ArrayList<>(cheesesInStock); } //최적화 버전 public List<Cheese> getCheeses() { return cheesesInStock.isEmpty() ? Collections.emptyList() : new ArrayList<>(cheesesInStock); }
Java
빈 컬렉션 반환하기
//빈 배열 반환 public Cheese[] getCheeses() { return cheesesInStock.toArray(new Cheese[0]); } //길이 0 배열 미리 만들어 놓기(오히려 성능이 떨어진다는 연구 결과도 있음) private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0]; public Cheese[] getCheeses() { return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY); }
Java
빈 배열 반환하기

 핵심 요약

null이 아닌, 빈 배열이나 컬렉션을 반환하자.
불변 컬렉션을 활용하자.
불변 배열은 오히려 성능이 떨어질 수 있으니 주의해서 사용하자.