이펙티브 자바
아이템 54. null이 아닌 빈컬렉션이나 배열을 반환하라.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| package com.github.sejoung.codetest.methods;
import java.util.ArrayList; import java.util.List;
public class NullCollectionsTest {
private final static List<Cheese> cheesesInStock = new ArrayList<>();
public List<Cheese> getCheeses() { return cheesesInStock.isEmpty() ? null : new ArrayList<>(cheesesInStock); }
public static void main(String[] args) { NullCollectionsTest shop = new NullCollectionsTest(); cheesesInStock.add(Cheese.STILTON);
List<Cheese> cheeses = shop.getCheeses();
if(cheeses != null && cheeses.contains(Cheese.STILTON)){ System.out.println("좋았어 바로 그거야"); } } }
|
실행결과
1 2 3 4
| 좋았어 바로 그거야
Process finished with exit code 0
|
위에 코드는 흔하게 볼수 있는 코드이다 여기서 getCheeses()에서 null을 반환하는것보다 빈 컬렉션을 반환하는 것이 좋다.
1 2 3 4 5 6 7 8
| public List<Cheese> getCheeses() { return new ArrayList<>(cheesesInStock); }
|
빈컬렉션을 반환하는 일차 코드는 위처럼 바꿀수 있다. 위 코드는 매번 빈 콜렉션을 할당하니 다시 한번 바꿔 줄수 있는 코드는
1 2 3 4 5
| public List<Cheese> getCheeses() { return cheesesInStock.isEmpty() ? Collections.emptyList() : new ArrayList<>(cheesesInStock); }
|
길이가 0일수도 있는 배열을 올바르게 반환하는 법
1 2 3 4 5 6
|
public Cheese[] getCheeses() { return cheesesInStock.toArray(new Cheese[0]); }
|
계속 생성하지 않게
1 2 3 4 5 6 7 8 9
| private final static Cheese [] EMPTY_CHEESE_ARRAY = new Cheese[0];
public Cheese[] getCheeses() { return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY); }
|
잘못된 예
1 2 3 4 5
| public Cheese[] getCheeses() { return cheesesInStock.toArray(new Cheese[cheesesInStock.size()]); }
|
배열에 미리 사이즈를 할당하지 않도록 한다.
참조