본문 바로가기

programming/java

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

[WHY]

1. null을 반환하는 메서드를 사용할 때면 방어 코드를 넣어야 하기 때문이다.

    - 코드가 지저분해주고 API를 사용하는 사용자 입장에서 사용하기 어렵다.

    - 잘못된 사용으로 버그의 원인이 될 가능성이 있다.

 

2. null을 반환함으로서 객체 생성 비용을 줄여 성능에 도움을 줄 수 있으나 더 좋은 기법이 있기 때문이다.

[WHEN]

컬렉션이나 배열을 반환할 때

[HOW]

1. 간단한 방법

컬렉션 : 빈 컬렉션을 반환할 때마다 생성하여 요소의 개수가 0개이든 N개이든 넣어서 반환한다.

private final List<Cheese> cheeseInStock = new LinkedList<>();

public List<Cheese> getCheese() {
    return new ArrayList<>(cheeseInStock);
}

배열 : 반환할 때 마다 배열을 생성한다.

 

2. 최적화 방법

컬렉션 : 불변 컬렉션 객체를 미리 생성하고 필요할 때 꺼내 쓴다. EX) Collection.emptyList() 등

private final List<Cheese> cheeseInStock = new LinkedList<>();

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

배열 : 1번 간단한 방법과 차이가 없다. 배열을 미리 할당하는 것이 성능상 이점이 명확하지 않기 때문에 사용하지 않는다고 함.

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

//new Cheese[0]은 toArray 메서드에 반환 타입을 알려주는 역할을 할 뿐이다.
public Cheese[] getCheese() {
    return cheeseInStock.toArray(new Cheese[0]);
}