Post

Java Immutable ArrayList

1. Immutable ArrayList

JDK, Guava 및 Apache Commons Collections 4를 사용하여 ArrayList를 불변으로 만드는 방법이다.

2. JDK 사용

JDK는 기존 컬렉션에서 수정할 수 없는 컬렉션을 가져오는 방법을 제공한다.

1
Collections.unmodifiableList(list);

새 컬렉션은 이 시점에서 더 이상 수정할 수 없다.

1
2
3
4
5
6
@Test(expected = UnsupportedOperationException.class)
public void givenUsingTheJdk_whenUnmodifiableListIsCreated_thenNotModifiable() {
    List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
    List<String> unmodifiableList = Collections.unmodifiableList(list);
    unmodifiableList.add("four");
}

3. Java 9 사용

Java 9부터 List<E>.of(E... elements) 정적 팩터리 메서드를 사용하여 변경할 수 없는 목록을 만들 수 있다.

1
2
3
4
5
6
@Test(expected = UnsupportedOperationException.class)
public final void givenUsingTheJava9_whenUnmodifiableListIsCreated_thenNotModifiable() {
    final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
    final List<String> unmodifiableList = List.of(list.toArray(new String[]{}));
    unmodifiableList.add("four");
}

기존 목록을 배열로 변환하는 방법에 유의해야한다. 이는 List.of(elements)가 vararg 매개변수를 허용하기 때문이다.

4. Guava 사용

Guava는 자체 버전의 ImmutableList를 만드는 유사한 기능을 제공한다.

1
ImmutableList.copyOf(list);

마찬가지로 결과 목록은 수정할 수 없어야 한다.

1
2
3
4
5
6
@Test(expected = UnsupportedOperationException.class)
public void givenUsingGuava_whenUnmodifiableListIsCreated_thenNotModifiable() {
    List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
    List<String> unmodifiableList = ImmutableList.copyOf(list);
    unmodifiableList.add("four");
}

이 작업은 실제로 보기가 아니라 원래 목록의 복사본을 만든다.

Guava는 또한 빌더를 제공한다. 단순히 List 대신 강력한 유형의 ImmutableList를 반환한다.

1
2
3
4
5
6
@Test(expected = UnsupportedOperationException.class)
public void givenUsingGuavaBuilder_whenUnmodifiableListIsCreated_thenNoLongerModifiable() {
    List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
    ImmutableList<String> unmodifiableList = ImmutableList.<String>builder().addAll(list).build();
    unmodifiableList.add("four");
}

5. Apache Collections Commons 사용

Commons Collection은 수정할 수 없는 목록을 생성하는 API도 제공한다.

1
ListUtils.unmodifiableList(list);

그리고 다시 결과 목록을 수정하면 UnsupportedOperationException이 발생한다.

1
2
3
4
5
6
@Test(expected = UnsupportedOperationException.class)
public void givenUsingCommonsCollections_whenUnmodifiableListIsCreated_thenNotModifiable() {
    List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
    List<String> unmodifiableList = ListUtils.unmodifiableList(list);
    unmodifiableList.add("four");
}

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.