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 .of((E ... elements))靜態工廠方法來創建不可變列表:

@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的項目,因此應該很容易直接導入和運行。