들어가며
빈 배열이나 컬렉션 대신 null을 반환하는 코드는 단점이 많다. 다음 코드를 보자.
1 | private final List<Cheese> cheeseInStock = ...; |
빈 객체 대신 null을 반환하는 메소드를 수행할때면 클라이언트 측에서 항시 방어적 코드를 작성해야 한다. 이를 빼먹으면 오류가 발생한다. 하지만 빈 컨테이너를 할당하는데도 비용이 드니 null을 리턴하는게 낫다는 주장도 있다. 이는 근거가 없다면 잘못된 말이다. 첫째로 빈 컨테이너를 할당하는 비용이 성능 저하의 주범이라고 확인되지 않았다면 이 정도의 성능 차이는 무시해도 된다. 둘째로 빈 컬렉션과 배열은 굳이 새로 할당하지 않고도 반환할 수 있다.
1 | public List<Cheese> getCheeses() { |
하지만 빈 컬렉션 할당이 성능 저하의 주범이 된다면 다른 방법도 있다. 불변 빈 컬렉션을 반환하는 방법이다.
1 | public List<Cheese> getCheeses() { |
배열도 마찬가지다. null을 반환하지말고 길이 0짜리 배열을 반환하자. 성능 저하가 걱정된다면 위와 같은 방식으로 길이 0짜리 배열을 미리 선언해두면 된다.
1 | private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0]; |
다만 다음과 같은 방법은 절대 쓰지말자. 성능 저하의 원인이 될 수도 있다.
1 | return cheesesInStock.toArray(new Cheese[cheesesInStock.size()]); |
다음은 toArray(T[] a)의 코드이다.
1 | /** |