如何防止ArrayList被结构修改?

时间:2014-05-23 12:13:16

标签: java collections arraylist final

我正在映射一个表...将员工称为ArrayList<Employee>这是一个类级变量,我将在多个地方使用它,而不是每次都使用数据库。

  

我想将它保持为只读,即。没有人可以在填充后添加或删除ArrayList中的元素。

有人可以建议一种方法来实现这个目标吗?

修改:修改后我想要抛出某种Exception

提前致谢

3 个答案:

答案 0 :(得分:5)

您可以使用Collections.unmodifiableList。它会将读取传递给后备列表,因此对后备(原始)列表的任何更新都将影响其他类看到的不可变视图。

如果您想要更新主列表时未更新的不可修改列表,则需要调用复制构造函数:

Collections.unmodifiableList(new ArrayList<Employee>(masterList));

在这种情况下,番石榴immutable list也是一种选择。

答案 1 :(得分:1)

不可修改的列表是你想要的doc,guava有immutable list

答案 2 :(得分:0)

您可以提供getter,它将返回现有列表的副本。

使用复制构造函数:

class Employee {
  private String id;
  ...

  public Employee(Employee other) {
    this.id = other.id; 
    ...
  }
}



List<Employee> getEmployeeData()
{
    //create a new list using the existing one via copy constructor
    return "Newly constructed list";
}

我想到的其他方法是在填充后在private上获得Iterator List,因此如果在创建迭代器后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出ConcurrentModificationException。但请注意,迭代器的失败快速行为无法保证。

来自javaDoc:

  

此类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除非通过迭代器自己的删除或者添加方法,迭代器将抛出一个ConcurrentModificationException。因此,在并发修改的情况下,迭代器快速而干净地失败,而不是在未来的未确定时间冒着任意的,非确定性行为的风险。   请注意,迭代器的快速失败行为无法得到保证,因为一般来说,在存在不同步的并发修改时,不可能做出任何硬性保证。失败快速的迭代器会尽最大努力抛出ConcurrentModificationException。因此,编写一个依赖于此异常的程序是正确的

是错误的