我有一个像数据库Rowset这样的数据结构,它有行和行有列。我需要初始化一个具有空值的列,当前代码是循环遍历每一列的行并将值初始化为NULL。如果您有100或10行的列,则效率非常低。
所以我保持一个初始化的列的列是RowSet级别,然后为各个行做一个这个Arraylist的克隆,因为我相信clone()比通过每个元素循环更快。
row.columnsValues = rowsset.NullArrayList.clone()
问题是NullArrayList在克隆后可能会被意外修改,从而牺牲了RowSet级别的ArrayList的完整性,以防止我做3件事
1)Delcaring ArrayList为final 2)我插入的任何元素都是final或null 3)将这个arrayList传递给其他数组的方法被声明为final。
听起来像个计划,你看到了什么漏洞吗?
答案 0 :(得分:7)
您可以使用Collections.unmodifiableList((List) originalList.clone())
返回指定列表的不可修改视图。此方法允许模块为用户提供对内部列表的“只读”访问。
答案 1 :(得分:5)
您仍然可以向阵列中添加新元素。
为什么不使用:
row.columnsValues = Collections.unmodifiableList( (ArrayList) rowsset.NullArrayList.clone())
答案 2 :(得分:0)
这是其实例保持公共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;
}