如何使集合在Java中只读?

Java Object-Oriented-Programming Programming

专用于集合的java.util包方法的Collections类,这些方法提供了涉及多态算法的各种附加操作。

此类提供unmodifiable()方法的不同变体,如下所示-

序号 方法与说明
1个 静态<T>集合<T> unmodifiableCollection(Collection <?扩展T> c)
此方法接受任何集合对象,并返回指定集合的不可修改视图。
2 静态<T>列表<T> unmodifiableList(列表<?扩展了T>列表)
此方法接受List接口的对象,并返回该对象的不可修改的视图。
3 静态<K,V> Map <K,V> unmodifiableMap(Map <?扩展K ,?扩展V> m)
此方法接受Map接口的对象,并返回该对象的不可修改的视图。
4 静态<T> Set <T> unmodifiableSet(Set <?扩展T> s)
此方法接受Set接口的对象,并返回该对象的不可修改的视图。
5 静态<K,V> SortedMap <K,V> unmodifiableableSortedMap(SortedMap <K ,?扩展V> m)
此方法接受SortedMap接口的对象,并返回该对象的不可修改的视图。
6 静态<T> SortedSet <T> unmodifiableSortedSet(SortedSet <T> s)
此方法接受SortedSet接口的对象,并返回指定排序集的不可修改视图。

通过使用关于集合的方法之一,可以使集合对象为只读。

以下Java程序创建一个ArrayList对象,向其中添加元素,然后将其转换为只读List对象。

现场演示

 import java.util.Collection;
import java.util.Collections;
import java.util.Vector;
public class CollectionReadOnly {
   public static void main(String[] args) {
      //Instantiating an ArrayList object
      Vector<String> vector = new Vector<String>();
      vector.add("JavaFx");
      vector.add("Java");
      vector.add("WebGL");
      vector.add("OpenCV");
      System.out.println(vector);
      Collection<String> immutableVector = Collections.unmodifiableCollection(vector);
      System.out.println("Vector converted to read only "+immutableVector);
      immutableVector.add("CoffeeScript");
   }
} 

例外

 [JavaFx, Java, WebGL, OpenCV]
Array list converted to read only [JavaFx, Java, WebGL, OpenCV]
Exception in thread "main" java.lang.UnsupportedOperationException
   at java.util.Collections$UnmodifiableCollection.add(Unknown Source)
   at September19.CollectionReadOnly.main(CollectionReadOnly.java:20) 

一旦检索到List对象的只读视图,就无法修改其内容,即,不能直接或使用Iterator对象从其中添加或删除元素,如果这样做,则会引发UnsupportedOperationException

2020-02-08 13:45
serpentfire
Jacob Martinez