페이스북에서 본 이일민님의 타임라인 글을 보고 정리 차원에서 다시 작성해본다.
Set<String> set = new HastSet<>();
// ... add some elements in set
set = Collections.unmodifiableSet(set);
Node[]
1개 (HashMap 내부에서 객체를 저장하는 table
) Set.of()
를 사용해서 불변 컬렉션을 생성해보자."생성후 변경은 필요없고(+불가능해야 하고) 참조만 한다면 기존의
Collections.unmodifiableSet()
대신 컬렉션 인터페이스의static
메서드로 추가된of()
로 생성하면 좋다.
Collections.unmodifiableSet()
이 동작하는 방식을 살펴보면 다음과 같이 set()
, add()
, addAll()
등의 변경을 가하는 메서드를 호출하면 내부적으로 UnsupportedOperationException을 발생시키도록 되어있다.Collections.unmodifiableSet()
등을 통해 생성된 객체가 아닌 변경 가능한 원본 객체를 통해 접근하게되면 Unmodifiable Collection도 변경된다. (원본 자체에 대한 수정을 막을 수 없음)Set<String> immutable = Collections.unmodifiableSet(new HashSet<>(set));
Set.of()
등은 원본 컬렉션을 참조하는 방식이 아닌 애초에 값들을 가지고 새로운 불변 컬렉션을 생성하기 때문에 불변성을 달성할 수 있다.결론을 3줄 요약해보자면
unmodifiableCollection()
대신 Collection의 of()
를 활용하자. (좀 더 쉽고, 내부적으로도 가벼운 불변 컬렉션을 만들 수 있다.)