Java中不可變的ArrayList
1.概述
該教程將快速展示與核心JDK,Guava以及Apache Commons Collections 4保持如何使ArrayList不變。
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。使用Java 9
從Java 9開始,我們可以使用List
@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參數。
3.使用Guava
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還提供了一個生成器builder-這將返回強類型的ImmutableList而不是簡單的List :
@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.使用Apache Collections Commons
最後,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的項目,因此應該很容易直接導入和運行。
0 條評論,你可以發表評論,我們會進行改進
