스터디 노트

[Java] 불변 단 건 리스트는 Collections.singletonList() 를 활용해보세요.

데구루_ 2023. 10. 17. 16:41

Java에서 단건의 요소가 담긴 Collection을 반환해줄일이 생길 수가 있습니다.

다양한 Collection 구현체들이 사용될 수 있지만, 오늘은 Collections의 singletonList()에 대해 알아보겠습니다.

...
return Collections.singoletonList("test");
...

위와 같이 사용하시면 됩니다.

 

사용하실 때엔 단일요소가 확정적으로 반영될 수 있는 비즈니스에서 활용하시면 됩니다.

기본적으로 singletonList 메소드는 SingletonList<>를 반환하도록 선언이 되어있습니다.

위의 설명을 읽어볼까요?

 

'저장한 개체만을 포함하는 불변 목록을 반환합니다. 반환된 목록은 직렬화가 가능합니다.'

 

결국 전달된 매개변수만으로 구성된 List를 반환해주는 역할을 합니다.

불변객체로써 하나의 요소만을 보장할 수 있다는 것이죠.

여기서 중요한 점은 불변객체의 요소 1개의 List라는 점입니다.

 

SingletonList 클래스의 내부 구현을 보면 한 번에 이해할 수 있습니다.

singletonList로 반환을 하게 되면 get메소드에서 0 이상이 들어올 경우 바로 IndexOutOfBoundsException을 보내줍니다.

0 이상을 선언하지 말라는 말이지요.

단건의 List를 사용해야 할 경우, Arrays.asList("test")보다 Collections.singletonList("test")를 사용하실 경우 보다 확실하게 단건임을 보장할 수 있습니다.

 

또한 Arrays.asList의 경우 set메소드를 활용할 수 있지만, Collections.singletonList의 경우 set메소드도 사용할 수 없습니다. 그 이유는 위에서 설명드린데로 불변 리스트이니까요!

// Arrays.asList로 생성한 List에서 set으로 값 변경
List<String> asList = Arrays.asList("a");
asList.set(0, "b"); // asList.get(0)의 값 b로 변경

// Collections.singletonList로 생성한 불변 List에서 set으로 값 변경
List<String> singletonList = Collections.singletonList("a");
singletonList.set(0, "b"); // java.lang.UnsupportedOperationException 발생

두 구현체 모두 요소를 추가하거나 삭제하는 등의 구조적 변경에 대해서는 막혀있지만, 값의 변경 기능은 Arrays.asList에서는 허용되고 singletonList에선 막혀있습니다.