[Effective Java 3/E] ITEM 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라

대연.

·

2021. 4. 15. 00:01

Effective Java 표지. Source : https://blog.insightbook.co.kr/

*알림 : *
Effective Java 3판은 Java 9까지 도입된 언어적 기능을 중심으로 서술되어 있습니다. 10버젼 이후의 Java 개발을 하시는 분들은 우회적인 접근법 대신 Java 언어 내 새로 도입된 기능이 더 간결하고 좋을 수 있습니다.

해당 포스팅은 SSAFY 내 책읽기 스터디의 활동을 통해 작성된 포스팅입니다.
https://github.com/kjsu0209/JavaBook
https://medium.com/javabook

 

JavaBook – Medium

Documentation space of our book study.

medium.com

 

kjsu0209/JavaBook

책읽기 스터디. Contribute to kjsu0209/JavaBook development by creating an account on GitHub.

github.com

일반적으로 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를 반환할 것이다.
  1. length가 0인 배열은 불변이다.
  2. 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()]); // 윗 코드와 같이 미리 필요한 공간만큼 배열을 할당하는건 // 퍼포먼스를 해친다는 연구 결과가 있다.
  3. 불변 빈 컬렉션을 지원하는 메서드들이 있다.
    • Collections.emptyList()
    • Collections.emptyMap()
    • Collections.emptySet()
    • 상기 메서드들은 불변의 빈 컬렉션을 반환한다.

0개의 댓글