//컬렉션이 비었을때 null을 반환하는 메소드 - 잘못된 메소드!

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

/**
*  @return 매장 안의 모든 치즈 목록을 반환한다.
*    단, 재고가 하나도 없다면 null을 반환한다.
*/

public List<Cheese> getCheese() {
    return cheesesInStock.isEmpty() ? null
        : new ArrayList<>(cheesesInStock);
}
  • 만약 null을 반환하면 클라이언트는 이 null 상황을 처리하는 코드를 또 작성해야함
List<Cheese> cheeses = shop.getCheese;
if (cheeses != null && cheeses.contatins(Cheese.STILTON))
    System.out.println("좋았어, 바로 그거야");
  • 컬렉션이나 배열같은 컨테이너가 비었을때 null을 반환하면 방어코드가 항상 필요하다.
  • 거의 확실하게 null이 발생하지 않더라도 언제 발생할지 모르는 일이다.

 

 

빈 컨테이너를 만드는건 메모리 낭비 아닌가?

  • 성능 분석 결과 유의미한 성능 차이를 발생시키지 않는다.
  • 빈 컬렉션과 배열은 굳이 새로 할당하지 않고도 반환할 수 있음
public List<Cheese> getCheese() {
    return new ArrayList<>(cheesesInStock);
}

 

  • 만약 성능저하가 염두된다면 불변인 컬렉션을 부여하면 된다.
//최적화 - 빈 컬렉션을 매번 새로 할당하지 않음

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

 

  • 배열은 길이가 0인 배열을 반환하면 된다.
public Cheese[] getCheese() {
    return cheesesInStock.toArray(new Cheese[0]);
}

 

  • 만약 이 방식이 성능 저하를 일으킬 것 같다면 미리 0짜리 불변 배열을 선언해놓으면 된다.
private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];

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

+ Recent posts