Javaの不変のArrayList
1. 概要
このクイックチュートリアルでは、コアJDK、Guava、最後にApache Commons Collections 4でhow to make an ArrayList immutableを示します。
この記事は、例としてここのthe “Java – Back to Basic” seriesの一部です。
参考文献:
2. JDKで
まず、JDKは既存のコレクションから変更不可能なコレクションを取得する優れた方法を提供します。
Collections.unmodifiableList(list);
この時点で、新しいコレクションは変更できなくなります。
@Test(expected = UnsupportedOperationException.class)
public void givenUsingTheJdk_whenUnmodifiableListIsCreated_thenNotModifiable() {
List list = new ArrayList(Arrays.asList("one", "two", "three"));
List unmodifiableList = Collections.unmodifiableList(list);
unmodifiableList.add("four");
}
3. グアバと
Guavaは、独自のバージョンのImmutableListを作成するための同様の機能を提供します。
ImmutableList.copyOf(list);
同様に-結果のリストは変更できません:
@Test(expected = UnsupportedOperationException.class)
public void givenUsingGuava_whenUnmodifiableListIsCreated_thenNotModifiable() {
List list = new ArrayList(Arrays.asList("one", "two", "three"));
List unmodifiableList = ImmutableList.copyOf(list);
unmodifiableList.add("four");
}
この操作は、ビューだけでなく、実際にはcreate a copy of the original listになることに注意してください。
Guavaはビルダーも提供します-これは単にListではなく強い型のImmutableListを返します:
@Test(expected = UnsupportedOperationException.class)
public void givenUsingGuavaBuilder_whenUnmodifiableListIsCreated_thenNoLongerModifiable() {
List list = new ArrayList(Arrays.asList("one", "two", "three"));
ImmutableList unmodifiableList = ImmutableList.builder().addAll(list).build();
unmodifiableList.add("four");
}
4. Apache CollectionsCommonsを使用する
最後に、Commons Collectionは、変更不可能なリストを作成するためのAPIも提供します。
ListUtils.unmodifiableList(list);
また、結果のリストを変更すると、UnsupportedOperationExceptionになります。
@Test(expected = UnsupportedOperationException.class)
public void givenUsingCommonsCollections_whenUnmodifiableListIsCreated_thenNotModifiable() {
List list = new ArrayList(Arrays.asList("one", "two", "three"));
List unmodifiableList = ListUtils.unmodifiableList(list);
unmodifiableList.add("four");
}
5. 結論
このチュートリアルでは、コアJDK、Google Guava、またはApache Commons Collectionsのいずれかを使用してcreate an unmodifiable List out of an existing ArrayListを簡単に実行する方法を説明します。
これらすべての例とコードスニペットcan be found over on Githubの実装–これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。