개요
Socket 사이드 프로젝트를 하는 중에 List<String> 타입의 해시태그 값들을 받는데, 테스트 코드를 작성하면서 빈 리스트를 반환해야 할 일이 생겨서 두 방법의 차이점은 무엇인지 쓴다면 어떤것을 써야하는지 헷갈려서 정리하게 된 글이다.
- Collections.emptyList( )
EmptyList라는 클래스가 별도로 존재했고, 이를 List<T>타입으로 캐스팅해 반환해 주고 있었다.
EmptyList의 경우 get() 호출 시, IndexOutOfBoundsException을 터트리고, size( )는 0을 반환하고, isEmpty( ) 메소드 또한 true인것을 확인할 수 있다. 즉 완전히 빈 리스트를 정의하는 특징들을 갖고 있다.
위의 초록 글씨에서 볼 수 있듯이, Returns an empty list (immutable). 즉, 불변의 빈 리스트를 반환하는 것이다.
그래서 emptyList는 Immutable하기 때문에 add메서드를 호출하면 UnsupportedOperationException이 발생한다.
- List.of( )
List.of()를 통해서도 리스트를 생성할 수 있다. 다만 List.of()는 ImmutableCollections의 리스트가 반환되기 때문에 이 역시 불변이다.
List.of( ), Collections.emptyList( ) 공통점
둘 다 불변이기 때문에 add, remove등의 작업을 수행하려고 하면 예외가 발생한다.
List.of( ), Collections.emptyList( ) 차이점
- List.of( ) 의 경우 of 안에 원소 설정이 가능해 get( )이나 size( ) 메소드 호출 시, 예외가 발생하지 않는다.
- Collections.emptyList( )의 경우 get( ) 메소드 호출시 Exception이 발생한다.
따라서,
어떤 값이 들어있는 List를 반환하고 싶은 경우, List.of( ) 사용
정말 아무값도 들어있지 않는 List를 반환하고 싶은 경우, Collections.emptyList( )를 사용
'Side Project > Socket' 카테고리의 다른 글
[MySQL] 테이블 데이터 다 지우기 (0) | 2024.02.05 |
---|---|
@Transactional 어느 Layer에 두는게 맞을까? (2) (0) | 2024.02.04 |
[Self-Invocation]@Transactional 어느 Layer에 두는게 맞을까? (1) (0) | 2024.02.04 |
[ERROR] Circle CI에서 오류가 생길경우 살펴볼 것! (0) | 2024.02.04 |
[Test]단위테스트 시 List가 empty & null일 경우 테스트 작성 팁 (0) | 2024.02.04 |