【问题标题】:Is there a way to prevent change of data in unmodifiableList in the below scenario?在以下情况下,有没有办法防止更改 unmodifiableList 中的数据?
【发布时间】:2020-02-20 03:27:10
【问题描述】:

在这里,我想创建一个不可修改列表,以使程序的其他部分无法修改其初始值。

这里是代码 sn-p 来说明我的问题。

public class Test {

    public static void main(String[] args) {
        List<String> unmodifiableList = new ArrayList<String>();
        unmodifiableList.add("test1");
        unmodifiableList.add("test2");
        unmodifiableList = Collections.unmodifiableList(unmodifiableList);
        List<String> modifiableList = new ArrayList<String>();
        modifiableList.addAll(unmodifiableList);
        unmodifiableList = modifiableList; 
        unmodifiableList.add("test3");
        for (String s : unmodifiableList) {
          System.out.println(s);
        }
    }
}

输出: 测试1 测试2 测试3

预期输出: 测试1 测试2

【问题讨论】:

  • 这是 Java,不是 JavaScript。
  • 如果你想让它不可修改,为什么要创建一个新的可修改列表?
  • unmodifiableList = modifiableList; 你认为这句话有什么作用?
  • 这里只是为了演示问题,但在实际应用中,如果其他开发人员可以使用上述方式修改我的unmodifiableList,那么我们可以放弃使其不可修改的唯一目的。

标签: java arraylist collections


【解决方案1】:

你可以试试下面吗。

    final List<String> unmodifiableList1 = Collections.unmodifiableList(unmodifiableList);

为避免创建额外列表,请尝试以下操作。

final List<String> finalList = Collections.unmodifiableList(Arrays.asList("test1", "test2"));

【讨论】:

  • 这似乎有效,但我们需要创建一个额外的列表。
  • 你可以试试这个最终的 List unmodifiableList =Collections.unmodifiableList( new ArrayList("test1", "test2"));避免创建额外列表
  • @lion_pankaj,如果你使用这个,final List unmodifiableList = Collections.unmodifiableList(new ArrayList("test1", "test2"));,它会给你编译错误在 Eclipse 中,说“构造函数 ArrayList(String, String) 未定义”。
  • 是的,对,你可以按照 final List list = Collections.unmodifiableList(new ArrayList(Arrays.asList("test1", "test2")));
  • 这将起作用 final List list = Collections.unmodifiableList(new ArrayList(Arrays.asList("test1", "test2")));
猜你喜欢
  • 1970-01-01
  • 2015-03-05
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多