Originally posted by bunsung92 February 22, 2023
📝 구성
Table of contents generated with markdown-toc
0. 들어가기에 앞서 🤔
아래와 같은 getCheeses() 메서드가 있다고 생각 해 보자.
public List<Cheese> getCheeses() {
return cheesesInStock.isEmpty() ? null : new ArrayList<>(cheesesInStock);
}
해당 메서드는 null을 반환할 수 있으므로, null 을 리턴 받게 된 다음 이어질 로직에서는 null을 대비하는 방어 코드를 작성해야 한다.
이보다 좋은 방법은 없을까?
이제부터 알아보자.
1. null이 아닌, 빈 컬렉션이나 배열을 반환하라 ✨
사실 개발자가 처리하고 대비해야 할 null은 수 없이 많다. 물론 하나하나 다 처리해야한다.
그러나 이제는 위와 같이 특수한 상황(List나 배열등의 컬렉션등을 리턴하는 상황에서 null 값을 깡으로 리턴하는)에는 아래와 같은 방법을 사용해 보자.
1.1 빈 컬렉션을 반환
null 대신에 다음과 같이 빈 컬렉션을 반환할 수 있다.
public List<Cheese> getCheeses() {
return new ArrayList<>(cheesesInStock);
}
null 을 반환하는 코드랑 크게 다르지 않지만 이는 분명 이점이 있다.
첫째, null 대신 빈 컬렉션을 반환하더라도 성능 차이가 크지 않다.
둘째, 빈 컬렉션은 굳이 새로 할당하지 않고도 반환할 수 있다.
근데 이 마저도 만석 지하철을 3번 보내면은 화가 나는 해당 아이템을 정리 중인 본인 입장에서는 불편하다.
바로 아무리 성능 차이가 크지 않다 하더라도 빈 컬렉션의 반환에 사용된 new 키워드 때문이다.
너무 보기 싫은데 어떻게 방법이 없을까?
한번 더 방법을 찾아보자.
1.2 빈 불변 컬렉션 반환
Collections 를 이용하면 빈 불변 컬렉션을 반환할 수 있다.
public List<Cheese> getCheeses() {
return cheesesInStock.isEmpty() ? Collections.emptyList() : new ArrayList<>(cheesesInStock);
}
Collections.emptyList() 가 반환하는 빈 불변 컬렉션은 다음과 같은 특징이 있다.
첫째, 불변이기 때문에 Thread Safe 하다.
둘째, 항상 동일한 싱글톤 인스턴스를 반환한다.
셋째, null 값이 리턴되어 오게 될 Side Effect 를 위한 방어적인 코드 작성도 피하게 해준다.
1.3 배열
배열은 더 간단하다.
빈 배열을 반환하거나, 길이 0 배열을 미리 선언해두고 불변인 배열을 만들어 사용하면 된다.
2. 핵심정리 📚
언젠가 메서드에 null 을 반환하고 있다면 null 이 아닌 빈 배열이나 컬렉션을 반환하자.
왜냐하면 null 을 반환하는 메서드는 처리하기 까다로우며 코드의 복잡도가 증가하고 가독성이 떨어지는 문제가 있을 수 있다.
3. 회고 🧹
2023.02.23 목
null 처리의 대가는 Optional로 알고 있었다.
하지만 이번 장을 정리하며 그리고 앞전 다른 아이템들을 정리하며 알게 된 사실들은 내가 알고있는 모든 사실이 항상 모든 경우에 100% 맞는것은 아니다 라는 것이다.
항상 의심하고 왜라는 질문을 스스로 답변하며 가장 좋은 방법을 선택하는 것을 지향하는 그런 개발자가 될 수 있도록 내실을 다지도록 하자.
내용 출처
https://stackoverflow.com/questions/12597277/why-would-someone-use-collections-emptylist-in-java
https://github.com/Meet-Coder-Study/book-effective-java/blob/main/8%EC%9E%A5/54_null%EC%9D%B4_%EC%95%84%EB%8B%8C_%EB%B9%88_%EC%BB%AC%EB%A0%89%EC%85%98%EC%9D%B4%EB%82%98_%EB%B0%B0%EC%97%B4%EC%9D%84_%EB%B0%98%ED%99%98%ED%95%98%EB%9D%BC_%EC%B5%9C%EB%9D%BD%EC%A4%80.md
Discussed in https://github.com/orgs/Study-2-Effective-Java/discussions/135
Originally posted by bunsung92 February 22, 2023
📝 구성
Table of contents generated with markdown-toc
0. 들어가기에 앞서 🤔
아래와 같은
getCheeses()메서드가 있다고 생각 해 보자.해당 메서드는 null을 반환할 수 있으므로, null 을 리턴 받게 된 다음 이어질 로직에서는 null을 대비하는 방어 코드를 작성해야 한다.
이보다 좋은 방법은 없을까?
이제부터 알아보자.
1. null이 아닌, 빈 컬렉션이나 배열을 반환하라 ✨
사실 개발자가 처리하고 대비해야 할 null은 수 없이 많다. 물론 하나하나 다 처리해야한다.
그러나 이제는 위와 같이 특수한 상황(List나 배열등의 컬렉션등을 리턴하는 상황에서 null 값을 깡으로 리턴하는)에는 아래와 같은 방법을 사용해 보자.
1.1 빈 컬렉션을 반환
null 대신에 다음과 같이 빈 컬렉션을 반환할 수 있다.
null 을 반환하는 코드랑 크게 다르지 않지만 이는 분명 이점이 있다.
근데 이 마저도 만석 지하철을 3번 보내면은 화가 나는 해당 아이템을 정리 중인 본인 입장에서는 불편하다.
바로 아무리 성능 차이가 크지 않다 하더라도 빈 컬렉션의 반환에 사용된 new 키워드 때문이다.
너무 보기 싫은데 어떻게 방법이 없을까?
한번 더 방법을 찾아보자.
1.2 빈 불변 컬렉션 반환
Collections 를 이용하면 빈 불변 컬렉션을 반환할 수 있다.
Collections.emptyList()가 반환하는 빈 불변 컬렉션은 다음과 같은 특징이 있다.1.3 배열
배열은 더 간단하다.
빈 배열을 반환하거나, 길이 0 배열을 미리 선언해두고 불변인 배열을 만들어 사용하면 된다.
2. 핵심정리 📚
언젠가 메서드에 null 을 반환하고 있다면 null 이 아닌 빈 배열이나 컬렉션을 반환하자.
왜냐하면 null 을 반환하는 메서드는 처리하기 까다로우며 코드의 복잡도가 증가하고 가독성이 떨어지는 문제가 있을 수 있다.
3. 회고 🧹
2023.02.23 목
null 처리의 대가는 Optional로 알고 있었다.
하지만 이번 장을 정리하며 그리고 앞전 다른 아이템들을 정리하며 알게 된 사실들은 내가 알고있는 모든 사실이 항상 모든 경우에 100% 맞는것은 아니다 라는 것이다.
항상 의심하고
왜라는 질문을 스스로 답변하며 가장 좋은 방법을 선택하는 것을 지향하는 그런 개발자가 될 수 있도록 내실을 다지도록 하자.