개발 기록

[이펙티브 자바] 아이템 54 본문

JAVA

[이펙티브 자바] 아이템 54

수염차 2025. 2. 4. 18:58

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

 

- 따라하면 안 되는 코드 (컬렉션이 비었으면 null을 반환)

private final List<Cheese> cheesesInStock = ...;
/**
* @return 매장 안의 모든 치즈 목록을 반환한다.
* 단, 재고가 하나도 없다면 null을 반환한다.
*/
public List<Cheese> getCheeses() {
	return cheesesInStock.isEmpty() ? null
		: new ArrayList<>(cheesesInStock);
}

 

-- null을 반환하게 되면 클라이언트는 항상 방어 코드를 넣어줘야함, 방어코드를 빼먹으면 오류가 발생할 수 있

getCheeses()를 사용하는 클라이언트는 null 확인을 추가로 해야한다.

if (cheeses != null && cheeses.contains(Cheese.STILTON)) {
... }

 

### null 대신 빈 컬렉션 할당시 비용.

1. 빈 컬렉션을 반환해도 사실상 신경 쓸 만한 성능 차이가 나지 않는다.

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

- 빈 불변 컬렉션 반환 : Collections.emptyList(), Collections.emptySet(), Collections.emptyMap()

: 최적화가 필요할 때만 사용.

 

### 빈 컬렉션을 반환하는 올바른 예

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

 

### 빈 배열을 반환하는 올바른 예

public Cheese[] getCheeses() {
	return cheesesInStock.toArray(new Cheese[0]);
}

 

- 최적화

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

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

 

 

### 핵심 정리

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

그렇다고 성능이 좋은 것도 아니다.

'JAVA' 카테고리의 다른 글

[이펙티브 자바] 아이템 53  (1) 2025.01.22
[이펙티브 자바] 아이템 32  (0) 2025.01.07
[이펙티브 자바] 아이템 29  (0) 2024.12.13
[이펙티브 자바] 아이템 26  (1) 2024.12.02
[이펙티브 자바] 아이템 24  (0) 2024.11.27
Comments