null을 반환하는 메서드
- 다음은 주변에서 흔히 볼 수 있는 메서드입니다.
private final List<Book> bookList;
public List<Book> getBooks() {
return bookList.isEmpty() ? null : bookList;
}
- null을 반환하게 되면 여러 문제들이 발생합니다.
- 먼저 해당 메서드를 사용하는 클라이언트는 null을 받는 상황에 대한 별도의 처리 코드를 반드시 작성해야 합니다. 만약 작성하지 않는다면 NullPointerException을 받게 될 것입니다.
- null을 반환하는 메서드 측에서도 해당 상황을 특수하게 취급해야 하므로 문서화와 같은 과정에서 별도로 처리해야 합니다.
빈 컬렉션 반환하기
- 위의 상황을 통해 null이 아닌 비어있는 컬렉션이나 배열을 반환해야 합니다.
- 만약 비어있는 컬렉션 등을 반환하는 것 자체가 성능에 이슈가 될 경우에도 방법이 있습니다. 바로 매번 똑같은 빈 불변 컬렉션을 반환하는 것입니다.
- 이는 빈 컬렉션의 경우 항상 비어있기 때문에 동일한 불변 컬렉션을 반환해도 문제가 되지 않습니다.
public List<Book> getBooks() {
return bookList.isEmpty() ? Collections.emptyList() : new ArrayList<>(bookList);
}
빈 배열 반환하기
- 배열의 경우에도 동일합니다. 만약 매번 빈 배열을 만드는 것 자체가 성능에 이슈가 될 경우, 길이 0의 배열을 만들어 놓아 해당 배열을 계속 반환하도록 만들 수 있습니다.
private final Book[] EMPTY_BOOK_ARRAY = new Book[0];
public Book[] getBooksArray() {
return bookList.toArray(EMPTY_BOOK_ARRAY);
}
- 해당 메서드에서는 항상 EMPTY_BOOK_ARRAY라는 빈 배열을 넣어줌으로서 리스트가 비어있다면 비어있는 길이 0의 배열을 반환하고, 그렇지 않은 경우에는 bookList을 배열로 변환하여 반환합니다.