Item54. null이 아닌 빈 collection 이나 배열을 반환하라
다음은 주변에서 흔히 볼 수 있는 method이다.
1 | private final List<Cheese> cheeseInStock = null; |
null을 반환해야할 특별한 이유가 있는 게 아니라면 위와 같이 빈 collection 대신에 null을 반환하는 코드는 이를 사용하는 client가 아래와 같이 null처리 로직을 작성하게끔 만든다.
1 | List<Cheese> cheese = shop.getCheese(); |
collection이나 배열같은 container가 비었을 떄 null을 반환하는 method를 사용할 때면 항상 이와 같은 방어 코드를 넣어주어야 한다.
null을 반환하는 족에서는 빈 container 를 만드는데도 비용이 드니 null을 반환하는게 낫다는 주장도 있지만 이는 잘못된 주장이다. 빈 container를 만드는데는 성능 차이가 미미하며, 굳이 빈 collection 과 배열은 새로 할당하지 않고도 반환할 수 있다.
1 | // 빈 collection을 반환하는 올바른 예 |
가능성은 작지만 , 사용패턴에 따라 빈 collection 할당이 성능을 떨어트리는 경우도 있다. 이에 대한 해결 방법은 자유롭게 공유해도 안전한 비어있는 ‘불변’ collection을 반환하는 것이다.
1 | public List<Cheese> getCheese(){ |
배열을 사용할때도 마찬가지이다. null을 반환하는 대신에 길이가 0인 배열을 반환하는게 좋다.
1 | // 길이가 0일수도 있는 배열을 반환하는 올바른 방법 |
이 방식이 성능을 저하시킬 것 같다면 미리 길이0 짜리의 배열을 선언해두고 매번 그 배열을 반환하면 된다.
1 | // 최적화 - 빈 배열을 매번 새로 할당하지 않도록 하였다. |