null을 반환하는 메서드
컬렉션이 비었으면 null을 반환하는 메서드 - 따라 하지 말 것
private final List<Cheese> cheeseInStock = ...;
/**
* @return 매장 안의 모든 치즈 목록을 반환한다.
* 단, 재고가 하나도 없다면 null을 반환한다.
*/
public List<Cheese> getCheeseInStock{
return cheeseInStock.isEmpty() ? null
: new ArrayList<>(cheeseInStock);
}
이 코드처럼 null을 반환한다면, 클라이언트는 이 null 상황을 처리하는 코드를 추가로 작성해야 한다.
- 컬렉션이나 배열 같은 컨테이너가 비었을 때 null을 반환하는 메서드를 사용할 때면 항시 이와 같은 방어 코드를 넣어줘야 한다.
- 클라이언트에서 이 코드를 빼먹으면 오류가 발생할 수 있다. null을 반환하는 쪽에서도 이 상황을 특별 취급해야 해서 코드가 더 복잡해진다.
빈 컨테이너를 할당하는 데도 비용이 드니 null을 반환하는 쪽이 낫다는 주장도 있지만 틀렸다.
1. 성능 분석 결과 이 할당이 성능 저하의 주범이라고 확인되지 않는 한 이 정도의 성능 차이는 신경 쓸 수준이 못된다.
2. 빈 컬렉션과 배열은 굳이 새로 할당하지 않고도 반환할 수 있다.
빈 컬렉션 반환
빈 컬렉션을 반환하는 올바른 예
- 빈 컬렉션을 반환하는 전형적인 코드
Collections.emptyList 사용
가능성은 작지만, 사용 패턴에 따라 빈 컬렉션 할당이 성능을 눈에 띄게 떨어 뜨릴 수도 있다.
불변 객체는 자유롭게 공유해도 안전하기 때문에 매번 똑같은 빈 불변 컬렉션을 반환하자.
- 빈 컬렉션을 매번 새로 할당하지 않도록 했다.
- 집합이 필요하면 Collections.emptySet을, 맵이 필요하면 Collections.emptyMap을 사용하면 된다.
배열 반환
배열을 쓸 때도 절대 null을 반환하지 말고 길이가 0인 배열을 반환하자.
길이가 0일 수도 있는 배열을 반환하는 올바른 방법
최적화 - 빈 배열을 매번 새로 할당하지 않음
- 길이 0인 배열은 모두 불변이기 때문에 길이 0짜리 배열을 미리 선언해 두고 매번 그 배열을 반환할 수 있다.
배열을 미리 할당 - 따라하지 말 것
오히려 성능이 떨어진다는 연구 결과도 있으므로 단순히 성능을 개선할 목적이라면 toArray에 넘기는 배열을 미리 할당하는 건 추천하지 않는다.
결론
- null이 아닌, 빈 배열이나 컬렉션을 반환하자.
- null을 반환하는 API는 사용하기 어렵고 오류 처리 코드도 늘어난다. 그렇다고 성능이 좋은 것도 아니다.
'Java > Effective Java' 카테고리의 다른 글
[Effective Java] Item 56. 공개된 API 요소에는 항상 문서화 주석을 작성하라 (0) | 2023.07.22 |
---|---|
[Effective Java] Item 55. 옵셔널 반환은 신중히 하라 (0) | 2023.07.22 |
[Effective Java] Item 53. 가변인수는 신중히 사용하라 (0) | 2023.07.16 |
[Effective Java] Item 51. 메서드 시그니처를 신중히 설계하라 (1) | 2023.07.16 |
[Effective Java] Item 50. 적시에 방어적 복사본을 만들라 (0) | 2023.07.16 |