TRY
지금까지 List.of
, Set.of
, Map.of
를 그냥 Collection을 간단하게 생성할때 사용했었습니다.
그동안 List등 Of()로 생성한 Object의 요소를 변경하지않았기에 몰랐는데 오늘 메서드를 통해 생성된 Collection 들이 Immutable이란걸 알게 되었습니다.
충격
CATCH
-
Of() static method
Jdk 9 부터 추가 된 Factory method 입니다.
Immutable 한 collection을 생성합니다.
그래서 add, put이나 set등 변경할 수 없게 됩니다.사용할때 다음과 같은 큰 특징을 갖습니다.
- null 요소로 만드려고 하면 NullPointerException 이 발생
- of()로 생성된 Collection은 불변이므로 요소를 추가 및 변경등을 하면 UnsupportedOperationException 이 발생
docs에 써있는 특징은 다음과 같습니다.(Docs 가서 보자)
Immutable List Static Factory Methods The List.of() static factory methods provide a convenient way to create immutable lists. The List instances created by these methods have the following characteristics: They are structurally immutable. Elements cannot be added, removed, or replaced. Calling any mutator method will always cause UnsupportedOperationException to be thrown. However, if the contained elements are themselves mutable, this may cause the List’s contents to appear to change. They disallow null elements. Attempts to create them with null elements result in NullPointerException. They are serializable if all elements are serializable. The order of elements in the list is the same as the order of the provided arguments, or of the elements in the provided array. They are value-based. Callers should make no assumptions about the identity of the returned instances. Factories are free to create new instances or reuse existing ones. Therefore, identity-sensitive operations on these instances (reference equality (==), identity hash code, and synchronization) are unreliable and should be avoided. They are serialized as specified on the Serialized Form page.
간단하게 요약하자면
- Of()로 생성된 객체는 불변이며 객체 변경을 시도할때 UnsupportedOperationException 발생하고
- Null 요소가 허용되지않고
- 제공된 순서를 유지하고
- Serialize 가능하고
- Value based이기 때문에 ==, hashcode, 동기화등 신뢰할 수 없다.
FINALLY
잘 알고 써야겠다는 생각이 들었습니다.
끝