我正在映射一个表...将员工称为ArrayList<Employee>
这是一个类级变量,我将在多个地方使用它,而不是每次都使用数据库。
我想将它保持为只读,即。没有人可以在填充后添加或删除
ArrayList
中的元素。
有人可以建议一种方法来实现这个目标吗?
修改:修改后我想要抛出某种Exception
。
提前致谢
答案 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
。因此,编写一个依赖于此异常的程序是正确的