public static final List<String> FINAL_COLLECTIONS = Arrays.asList("A", "B", "C");
list 를 위와 같이 final로 선언해주었음에도 sonar cube에서 이는 변수 재선언을 막아줄뿐, 상태를 변경하는 것을 막을 수 없다고 경고한다. 즉 FINAL_COLLECTIONS.add("D"); // 가능
와 같이 해당 객체에 대한 완전한 immutable 상태를 보장하지 않는다는 의미이다.
이를 해결하기 위해서는 세가지 방법이 있다.
private static final SomeType [] SOMETHINGS = { ... };
public static final getSomethings() {return SOMETHINGS;}
private static final SomeType [] THE_THINGS = { ... };
public static final List<SomeType> SOMETHINGS =
Collections.unmodifiableList(Arrays.asList(THE_THINGS));
immutable 객체를 수정한다면 java.lang.UnsupportedOperationException
이 발생한다.
public static final List<String> FINAL_COLLECTIONS = List.of("A", "B", "C");
java9 부터는 immutable 컬렉션 생성을 위한 인터페이스를 제공을 통해 보다 간결한 문법을 지원한다.
참조.
CERT, OBJ13-J. - Ensure that references to mutable objects are not exposed