克隆java ArrayList并防止其被修改
我有一个类似于数据库行集的数据结构,它有行,行有列。我需要用空值初始化一个列,当前代码是循环遍历一行的每一列,并将值初始化为空。如果您有100行或10列,这是非常低效的 因此,我将保留行集级别的列的初始化ArrayList,然后对单个行执行此ArrayList的克隆,因为我相信克隆()比循环遍历每个元素更快 row.columnsValues=rowsset.NullArrayList.clone() 这方面的问题是NullArrayList在被克隆后可能会被意外修改,从而牺牲了ArrayList在行集级别的完整性,以防止我做3件事 1) DelayList作为最终版本 2) 我插入的任何元素都是final或null 3) 通过此arrayList传递给其他数组的方法被声明为final 听起来像是一个计划,你看到洞了吗?你可以用 返回指定列表的不可修改视图。此方法允许模块向用户提供对内部列表的“只读”访问克隆java ArrayList并防止其被修改,java,arraylist,Java,Arraylist,我有一个类似于数据库行集的数据结构,它有行,行有列。我需要用空值初始化一个列,当前代码是循环遍历一行的每一列,并将值初始化为空。如果您有100行或10列,这是非常低效的 因此,我将保留行集级别的列的初始化ArrayList,然后对单个行执行此ArrayList的克隆,因为我相信克隆()比循环遍历每个元素更快 row.columnsValues=rowsset.NullArrayList.clone() 这方面的问题是NullArrayList在被克隆后可能会被意外修改,从而牺牲了ArrayLis
您仍然可以向数组中添加新元素 为什么不直接使用:
row.columnsValues=Collections.unmodifiableList((ArrayList)rowsset.NullArrayList.clone())
这是一个实例保持公共ArrayList的类,该列表是共享的,但不能在此类之外更改。当返回浅层副本时,此列表中的元素也需要保护自己
public class ArrayListUnmodifiability {
private ArrayList myList;
public ArrayListUnmodifiability() {
myList = new ArrayList(2);
MyObj obj = new MyObj("Cannot be changed");
obj.setValue(1);
myList.add(0, obj);
myList.add(1, null);
}
public ArrayList getList() {
return (ArrayList) myList.clone();
}
}
public class MyObj {
public MyObj(String name) {
this.name = name;
}
public String getName() {
return name;
}
private final String name;
}
这不好。通过向原始列表中添加一些内容,您仍然可以向不可修改列表中添加一些内容。clone()方法返回一个对象,因此rowsset.NullArrayList.clone()应强制转换为ArrayList=Collection.unmodifiableList(rowsset.NullArrayList.clone())我需要按照以下方式修改myList元素myList.set(I,new Object()); 但是,我想防止,当返回对象作为clone()的结果是原始对象之一时,myList.get(I).setXYZ()。我认为解决这个问题的方法是,当我创建原始的NullArrayList时,我需要存储定义为“final”final Object obj=new Object()的对象;添加(i,obj)@user222164:这意味着你不希望你的列表不可修改,但是列表中的实际对象是不可修改的,这是另一个问题,尽管很容易解决。谢谢大家。我想保护原始列表及其内容,它在我的头脑中变得清晰。我将发布解决方案。