天天看點

Java不可變ArrayList

集合類在Java中是引用類型,在操作的時候可能不經意間被程式修改,一些初級開發經常會犯類似的錯誤。這裡我們讨論下如何讓ArrayList不可改變。本文将示範以下幾種方式:

  • JDK
  • Guava
  • Apache Commons Collection4

JDK給我們提供了一個很簡便的方式從集合中擷取一個不可變集合

Collections.unmodifiableList(List<? extends T> list)
           

我們可以簡單的看一下其實作方式:

public static <T> List<T> unmodifiableList(List<? extends T> list) {
        return (list instanceof RandomAccess ?
                new UnmodifiableRandomAccessList<>(list) :
                new UnmodifiableList<>(list));
    }


           
Java不可變ArrayList

image.png

我們可以看到UnmodifiableList内對集合的操作都會抛出異常,是以傳回的集合,清單對象是不可變的。

guava提供了一個建立不可變清單的對象

ImmutableList

ImmutableList.copyOf(list);
           

我們看個案例

public class App {
    public static void main(String[] args) {
        List<Integer> givenList = Arrays.asList(1, 2, 3, 4, 5, 6);
        List<Integer> immutableList = ImmutableList.copyOf(givenList);
        immutableList.add(10);
    }
}
// 會抛出異常
Exception in thread "main" java.lang.UnsupportedOperationException
    at com.google.common.collect.ImmutableCollection.add(ImmutableCollection.java:225)
    at me.aihe.App.main(App.java:19)
           

Commons Collection

Apache Commons給我們提供了很多工具類,Collection也是其中的一個工具庫,也提供了一個簡單的API來建立不可變清單。

ListUtils.unmodifiableList(list);
           

然後示範一個簡單的案例,會抛出UnsupportedOperationException。

public class App {
    public static void main(String[] args) {
        List<Integer> givenList = Arrays.asList(1, 2, 3, 4, 5, 6);
        List<Integer> integers = ListUtils.unmodifiableList(givenList);
        integers.add(10);
    }
}
//結果抛出異常
Exception in thread "main" java.lang.UnsupportedOperationException
    at org.apache.commons.collections4.list.UnmodifiableList.add(UnmodifiableList.java:83)
    at me.aihe.App.main(App.java:19)

           

小結

//JDK
Collections.unmodifiableList(List<? extends T> list)
//Guava
ImmutableList.copyOf(list);
//Commons Collection4
ListUtils.unmodifiableList(list);
           

最後

主要說了幾種建立不可變清單的方法,做了簡單的示範,開發中有時會碰到的場景之一。

希望有幫助

參考