*알림 : *
Effective Java 3판은 Java 9까지 도입된 언어적 기능을 중심으로 서술되어 있습니다. 10버젼 이후의 Java 개발을 하시는 분들은 우회적인 접근법 대신 Java 언어 내 새로 도입된 기능이 더 간결하고 좋을 수 있습니다.해당 포스팅은 SSAFY 내 책읽기 스터디의 활동을 통해 작성된 포스팅입니다.
https://github.com/kjsu0209/JavaBook
https://medium.com/javabook
일반적으로 API가 요청을 올바르게 수행하지 못했거나, 메서드가 해당하는 원소를 찾지 못했다거나 하는 것을 반환값으로 표시하기 위해 null을 리턴하는 경우가 잦다.
예제 1 : 치즈 재고관리
private final List<Cheese> cheesesInStock = ...;
public List<Cheese> getCheese(){
return cheesesInStock.isEmpty() ? null : new ArrayList<>(cheesesInStock);
}
// 만약 cheesesInStock이 비었다면 null을 반환한다.
List<Cheese> cheeses = shop.getCheeses();
if (cheeses != null && cheeses.contains(Cheese.STILTON))
System.out.println("Jolly good, just the thing.");
// 클라이언트가 불필요하게 null인지 확인하는 과정을 거쳐야한다.
문제는 null 값을 리턴하게 될 경우 클라이언트에서 별도로 null을 핸들링하는 수고를 지게된다. 클라이언트가 핸들링을 까먹는다면 오류가 발생할 것이며, 클라이언트가 까먹지 않고 핸들링을 제대로 해주길 기도하는 것은 좋은 설계가 아니다.(인간은 불완전하다.)
대신, 빈 컬렉션이나 빈 배열을 반환하자.
예제 2 : null 대신 빈 컬렉션 반환
public List<Cheese> getCheeses() {
return new ArrayList<>(cheesesInStock);
}
// 만약 cheesesInStock의 길이가 0이라면,
// 빈 ArrayList를 반환할 것이다.
- length가 0인 배열은 불변이다.
public Cheese[] getCheeses() { return cheesesInStock.toArray(new Cheese[0]); } // cheesesInStock을 배열로 바꾸는 과정에서, // new Cheese[0]이 우리가 원하는 반환타입을 지정한다. // Cheese[] private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0]; public Cheese[] getCheeses() { return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY); } // 불변이기에 캐싱하여 재사용할 수 있다. return cheesesInStock.toArray(new Cheese[cheesesInStock.size()]); // 윗 코드와 같이 미리 필요한 공간만큼 배열을 할당하는건 // 퍼포먼스를 해친다는 연구 결과가 있다.
- 불변 빈 컬렉션을 지원하는 메서드들이 있다.
- Collections.emptyList()
- Collections.emptyMap()
- Collections.emptySet()
- 상기 메서드들은 불변의 빈 컬렉션을 반환한다.
'IT > Effective Java' 카테고리의 다른 글
[Effective Java 3/E] ITEM 56. 공개된 API 요소에는 항상 문서화 주석을 작성하라 (0) | 2021.04.15 |
---|---|
[Effective Java 3/E] ITEM 55. 옵셔널 반환은 신중히 하라 (0) | 2021.04.15 |
[Effective Java 3/E] ITEM 53. 가변인수는 신중히 사용하라 (0) | 2021.04.15 |
[Effective Java 3/E] ITEM 52. 다중정의는 신중히 사용하라 (0) | 2021.04.14 |
[Effective Java 3/E] ITEM 51. 메서드 시그니쳐를 신중히 설계하라 (0) | 2021.04.14 |
댓글