카테고리 없음

[JAVA] Collections emptyList() vs EMPTY_LIST

따뜻한 세상을 만드는 개발자 2023. 7. 2. 10:46

빈 리스트를 반환하는 경우 Collections의 emptyList()가 자주 사용됩니다.

 

하지만 Collections에 public으로 EMPTY_LIST도 노출이 되어 있기 때문에 emptyList() 대신 EMPTY_LIST을 사용하는 코드도 보게 되는데요.

 

결론적으로 이야기 하면 EMPTY_LIST 보다는 emptyList()을 사용해야 합니다.

 

그 이유는 Generic 관점에서 차이가 있기 때문입니다.

  • EMPTY_LIST: Raw 타입으로 타입 안전하지 않음
  • emptyList(): Generic으로 되어 있어 타입 안전

emptyList 메서드가 EMPTY_LIST를 반환하기는 하지만 아래와 같이 Generic을 통해 타입 변환을 해줍니다.

public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

 

이 둘의 차이는 반환된 리스트를 다른 메서드의 파라미터로 넘기거나, 다른 변수에 넣을 때 발생하는데요.

EMPTY_LIST를 사용하는 경우 아래처럼 제네릭 타입체크가 전혀 이루어지지 않게 됩니다.

public void testEmptyList() {
  var fieldEmptyList = Collections.EMPTY_LIST;
  var methodEmptyList = Collections.emptyList();

  foo(fieldEmptyList); // 정상 호출
  foo(methodEmptyList); // 컴파일 에러
}

public void foo(List<String> stringSource) {
  for (String s : stringSource) {
    System.out.println(s);
  }
}