NMP-Study / EffectiveJava2022

Effective Java Study 2022
5 stars 0 forks source link

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

Closed okhee closed 1 year ago

RulLu16 commented 1 year ago

컬렉션이 비었으면 null을 반환한다?

public List getCheeses() { return cheeseInStock.isEmpty()? null : new ArrayList<>(cheeseInStock); }

- null을 반환하게 되면 받는 측에서 항상 방어코드를 넣어야한다.
- 만약 방어로직이 없다면 npe 발생 우려, 방어로직 추가로 코드가 복잡해질 수 있다!

### 빈 컨테이너를 할당하는 데도 비용이 드니 null을 반환하는 쪽이 낫다는 주장은 틀린 주장이다. 
1. 성능 분석 결과 이 할당이 성능 저하의 주범이라고 확인되지 않는 한(#67) 이 정도의 성능 차이는 신경 쓸 수준이 아니다!
2. 빈 컬렉션과 배열은 굳이 새로 할당하지 않고도 반환할 수 있다. 

### 빈 컬렉션을 반환하는 올바른 예
~~~java
private final List<Cheese> cheeseInStock = null;

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

사용 패턴에 따라 빈 컬렉션 할당이 성능을 눈에 띄게 떨어 뜨릴 수도 있다. (가능성이 적다)

Collections.emptyList

Array

public Cheese[] getCheeses() { return cheeseInStock.toArray(EMPTY_CHEESE_ARRAY); }


- 단순히 성능을 개선할 목적이라면 toArray에 넘기는 배열을 미리 할당하는건 추천하지 않는다. 
- 오히려 성능이 떨어질 수도 있다고 한다(?) -> 그냥 emptyList 쓰자!

## 핵심 정리

> null이 아닌, 빈 배열이나 컬렉션을 반환하라. 
> null을 반환하는 API는 사용하기 어렵고 오류 처리 코드도 늘어난다. 그렇다고 성능이 좋은 것도 아니다.