如何使ArrayList在Java中只读?

java.util.Collections类的unmodifiableList()方法接受List接口的一个对象(实现其类的对象),并返回给定对象的不可修改形式。用户仅对获得的列表具有只读访问权限。

示例

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

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ArrayListReadOnly {
   public static void main(String[] args) {
      //实例化ArrayList对象
      ArrayList<String> list = new ArrayList<String>();
      list.add("JavaFx");
      list.add("Java");
      list.add("WebGL");
      list.add("OpenCV");
      System.out.println(list);
      //将ArrayList转换为只读列表
      List<String> myList = (List<String>) Collections.unmodifiableList(list);
      System.out.println("Array list converted to read only "+list);
   }
}

输出结果

[JavaFx, Java, WebGL, OpenCV]
Array list converted to read only [JavaFx, Java, WebGL, OpenCV]

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

示例

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ArrayListReadOnly {
   public static void main(String[] args) {
      //实例化ArrayList对象
      ArrayList<String> list = new ArrayList<String>();
      list.add("JavaFx");
      list.add("Java");
      list.add("WebGL");
      list.add("OpenCV");
      System.out.println(list);
      //将ArrayList转换为只读列表
      List<String> myList = (List<String>) Collections.unmodifiableList(list);
      myList.add("CoffeeScript");
      System.out.println("Array list converted to read only "+myList);
   }
}

运行时异常

[JavaFx, Java, WebGL, OpenCV]
Exception in thread "main" java.lang.UnsupportedOperationException
   at java.util.Collections$UnmodifiableCollection.add(Unknown Source)
   at SEPTEMBER.remaining.ArrayListReadOnly.main(ArrayListReadOnly.java:20)