1. 概要

このクイックチュートリアルでは、コアJDK、Guava、最後にApache CommonsCollections4を使用してArrayListを不変にする方法を示します。

この記事は、ここBaeldungの「Java –BacktoBasic」シリーズの一部です。

2. JDKを使用

まず、JDKは、既存のコレクションから変更不可能なコレクションを取得するための優れた方法を提供します。

Collections.unmodifiableList(list);

この時点で、新しいコレクションは変更できなくなります。

@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");
}

2.1. Java9を使用

Java 9以降、 リスト .of(E…要素) 不変リストを作成するための静的ファクトリメソッド:

@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を配列に変換する方法に注意してください。 これは、 List.of(elements)がvarargパラメーターを受け入れるためです。

3. グアバと

Guavaは、独自のバージョンのImmutableListを作成するための同様の機能を提供します。

ImmutableList.copyOf(list);

同様に–結果のリストは変更できません。

@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が返されます。

@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");
}

4. ApacheCollectionsCommonsを使用する

最後に、Commons Collectionは、変更不可能なリストを作成するためのAPIも提供します。

ListUtils.unmodifiableList(list);

また、結果のリストを変更すると、UnsupportedOperationExceptionが発生するはずです。

@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");
}

5. 結論

このチュートリアルでは、コアJDK、Google Guava、またはApache Commons Collectionsのいずれかを使用して、既存のArrayListから変更不可能なリストを簡単に作成する方法を説明します。

これらすべての例とコードスニペットの実装は、Github にあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。