Skip to content

item 54 JungHyunLyoo

JungHyunLyoo edited this page May 8, 2020 · 6 revisions

null을 반환하는 메서드가 굴리는 스노우볼

null을 반환하는 메서드를 사용하는 클라이언트는 null을 return 받게 되면 오류의 늪으로 빠지게 될 수 있다. 따라서 null을 적절하게 처리하는 방어 코드를 추가로 작성해야 한다.

if(Objects.nonNull(value)){
    //exec
}

방어 코드를 넣어야 하는 메서드가 길고 복잡하다면...? 끔찍...

그래서 차라리 빈 컨테이너(컬렉션, 배열, etc..)를 반환하는 것이 낫다.

빈 컨테이너를 반환하는 것이 낭비다?

위와 같은 주장을 할 수도 있다. 하지만 이는 두 가지 면에서 틀린 주장이다.

1.성능 차이는 신경 쓸 수준이 못된다.(item 67참조)

2.빈 컬렉션과 배열은 굳이 새로 할당하지 않고도 반환할 수 있다.

매번 똑같은 빈 '불변' 컬렉션을 반환하는 것이다. 불변 객체는 자유롭게 공유해도 안전하다!(item 17)

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

public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

public static final List EMPTY_LIST = new EmptyList<>();

배열도 마찬가지다

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

public Cheese[] getCheeses() {
    return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);
}
Clone this wiki locally