Item 54 : null이 아닌, 빈 컬렉션이나 배열을 반환하라
2021. 8. 22. 23:43
//컬렉션이 비었을때 null을 반환하는 메소드 - 잘못된 메소드!
private final List<Cheese> cheesesInStock = ...;
/**
* @return 매장 안의 모든 치즈 목록을 반환한다.
* 단, 재고가 하나도 없다면 null을 반환한다.
*/
public List<Cheese> getCheese() {
return cheesesInStock.isEmpty() ? null
: new ArrayList<>(cheesesInStock);
}
- 만약 null을 반환하면 클라이언트는 이 null 상황을 처리하는 코드를 또 작성해야함
List<Cheese> cheeses = shop.getCheese;
if (cheeses != null && cheeses.contatins(Cheese.STILTON))
System.out.println("좋았어, 바로 그거야");
- 컬렉션이나 배열같은 컨테이너가 비었을때 null을 반환하면 방어코드가 항상 필요하다.
- 거의 확실하게 null이 발생하지 않더라도 언제 발생할지 모르는 일이다.
빈 컨테이너를 만드는건 메모리 낭비 아닌가?
- 성능 분석 결과 유의미한 성능 차이를 발생시키지 않는다.
- 빈 컬렉션과 배열은 굳이 새로 할당하지 않고도 반환할 수 있음
public List<Cheese> getCheese() {
return new ArrayList<>(cheesesInStock);
}
- 만약 성능저하가 염두된다면 불변인 컬렉션을 부여하면 된다.
//최적화 - 빈 컬렉션을 매번 새로 할당하지 않음
public List<Cheese> getCheese() {
return cheesesInStock.isEmpty() ? Collections.emptyList()
: new ArrayList<>(cheesesInStock);
}
- 배열은 길이가 0인 배열을 반환하면 된다.
public Cheese[] getCheese() {
return cheesesInStock.toArray(new Cheese[0]);
}
- 만약 이 방식이 성능 저하를 일으킬 것 같다면 미리 0짜리 불변 배열을 선언해놓으면 된다.
private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];
public Cheese[] getCheese() {
return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);
}
'책 > 이펙티브자바' 카테고리의 다른 글
Item 56 : 공개된 API 요소에는 항상 문서화 주석을 작성하라 (0) | 2021.08.24 |
---|---|
Item 55 : 옵셔널 반환은 신중히 하라 (0) | 2021.08.23 |
Item 53 : 가변인수는 신중히 사용하라 (0) | 2021.08.21 |
Item 52 : 다중정의는 신중히 사용하라 (0) | 2021.08.20 |
Item 51 : 메소드 시그니처를 신중히 설계하라 (0) | 2021.08.19 |