【问题标题】:make ArrayList Read only使 ArrayList 只读
【发布时间】:2011-01-26 00:51:48
【问题描述】:

在Java中,如何在初始化后将ArrayList设为只读(这样任何人都不能添加元素、编辑或删除元素)?

【问题讨论】:

    标签: java collections jakarta-ee arraylist


    【解决方案1】:

    ArrayList 传递给Collections.unmodifiableList()。它返回指定列表的不可修改视图。只使用这个返回的List,而不是原来的ArrayList

    【讨论】:

    • "... 并且只使用返回的列表,而不是原来的 ArrayList" 是一个非常重要的补充!将ArrayList 传递给该方法不会神奇地更改对象。它只返回一个不可修改的包装器。
    • 有时你想保留原来的ArrayList。这对于公开封装在对象中的数据的类似List 的视图来说是一种很好的技术。对对象的修改将更新List 视图,但视图本身不接受任何修改。
    • unmodifiableList() 返回一个 List 对象。我可以以某种方式将其转换回ArrayList吗?当我尝试这样做时,我得到了一个ClassCastException
    • @Pieter 不可修改的列表不是扩展;这是一个委托人。您始终可以将内容复制到新列表并对其进行修改,但是没有提供用于修改不可修改列表上的内容的机制,这有点意思。
    • 请注意,这仅提供运行时安全性,因为返回的包装器具有仅在调用时抛出异常的突变器。最好使用没有修改器的只读包装器来获得编译时安全。
    【解决方案2】:

    您确定要在这种情况下使用ArrayList 吗?

    也许最好先用您的所有信息填充ArrayList,然后在Java 程序初始化时将ArrayList 转换为最终数组。

    【讨论】:

    • 嗨 Jama,我发现 Collections.unmodifiableList() 这将按我想要的方式工作。试试这个方法,很简单
    • 好吧,我会的……太棒了!
    【解决方案3】:

    将列表对象传递给Collections.unmodifiableList()。请参阅下面的示例。

    import java.util.*;
    
    public class CollDemo
    {
        public static void main(String[] argv) throws Exception
        {
            List stuff = Arrays.asList(new String[] { "a", "b" });
            List list = new ArrayList(stuff);
            list = Collections.unmodifiableList(list);
            Set set = new HashSet(stuff);
            set = Collections.unmodifiableSet(set);
            Map map = new HashMap();
            map = Collections.unmodifiableMap(map);
            System.out.println("Collection is read-only now.");
        }
    }
    

    【讨论】:

      【解决方案4】:

      将集合对象传递给 Collections 类的等效不可修改函数。以下代码显示了unmodifiableList的使用

      import java.util.ArrayList;
      import java.util.Collections;
      import java.util.List;
      
      
      public class Temp {
      
          public static void main(String[] args) {
      
              List<Integer> objList = new ArrayList<Integer>();
              objList.add(4);
              objList.add(5);
              objList.add(6);
              objList.add(7);
      
              objList = Collections.unmodifiableList(objList);
              System.out.println("List contents " + objList);
      
              try {
                  objList.add(9);
              } catch(UnsupportedOperationException e) {
                  e.printStackTrace();
                  System.out.println("Exception occured");
              }
              System.out.println("List contents " + objList);
          }
      
      }
      

      同样,您也可以创建其他不可修改的集合

      【讨论】:

        猜你喜欢
        • 2020-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-22
        • 2019-09-17
        • 2010-12-21
        • 2015-12-13
        相关资源
        最近更新 更多