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

    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()
      • 상기 메서드들은 불변의 빈 컬렉션을 반환한다.

    댓글