1. null 을 반환하는 경우
private final List<Cheese> cheesesInStock = ...;
/**
* @return 매장 안의 모든 치즈 목록을 반환한다.
* 단, 재고가 하나도 없다면 null을 반환한다.
*/
public List<Cheese> getCheeses() {
return cheesesInStock.isEmtpy() ? null
: new ArrayList<>(cheesesInStock);
}
위 코드처럼 cheeseInStock 이 비어있다고 해서 null 을 반환한다면, 클라이언트는 이 null 상황을 대비해 추가로 코드를 작성해야한다.
List<Cheese> cheeses = shop.getCheeses();
if (cheeses != null && cheeses.contains(Cheese.M\\ozzarell
...
}
위와 같이 방어코드를 적어주어야 하며, 빼먹게 되면 오류가 발생할 수 있다. 이로인해 코드가 더 복잡해진다. 빈 컬렉션을 올바르게 반환하는 예를 살펴보자.
2. 빈 컬렉션을 반환하자.
public List<Cheese> getCheeses() {
return new ArrayList<>(cheesesInStock);
}
빈 컬렉션을 할당하는 것이다. 매번 새롭게 할당하는 것이 부담스럽고 성능이 나오지 않는다면, 아래 예시와 같이 '불변'컬렉션을 반환하면 된다.
public List<Cheese> getCheeses() {
return cheesesInStock.isEmpty() ? Collections.emptyList()
: new ArrayList<>(cheesesInStock);
}
집합이 필요하면 Collections.emptySet 을, 맵이 필요하면 Collections.emptyMap 을 사용하면 된다.
3. 길이가 0인 배열을 반환하자
public Cheese[] getCheeses() {
return cheesesInStock.toArray(new Cheeses[0]);
}
toArray 메서드에 길이 0짜리 배열을 건네 반환하자. 이 방식이 성능이 안좋다면, 길이 0짜리 배열을 미리 선언해두고 매번 그 배열을 반환하자. 길이가 0인 배열은 모두 불변이기 때문이다.
private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];
public Cheese[] getCheeses() {
return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);
}

'1️⃣ 백앤드 > 이펙티브 자바' 카테고리의 다른 글
| [아이템56] 공개된 API 요소에는 항상 문서화 주석을 작성하라 (1) | 2024.11.28 |
|---|---|
| [아이템55] 옵셔널 반환은 신중히 하라 (0) | 2024.11.28 |
| [아이템53] 가변인수는 신중히 사용하라 (0) | 2024.11.26 |
| [아이템52] 다중정의는 신중히 사용하라 (0) | 2024.11.25 |
| [아이템51] 메서드 시그니처를 신중히 설계하라 (0) | 2024.11.24 |