我在代码中有很多实例,其中集合,通常是从方法返回的列表,并且考虑到调用者可能会更改该列表,因此制作了防御性副本。
JDK 似乎没有为此目的提供包装器,所以我试图推出自己的包装器(注意:java.util.concurrent.CopyOnWriteArrayList不是我在这里寻找的)。
从原理上讲,我正在尝试的是:
public class CopyOnWriteList<E> extends List<E> {
protected List<E> list;
protected boolean isCopied;
public CopyOnWriteList(List<E> list) {
this.list = list;
}
private void ensureCopy() {
if (!isCopied) {
list = new ArrayList<E>(list);
isCopied = true;
}
}
public E get(int i) {
return list.get(i);
}
public boolean add(E e) {
ensureCopy();
return list.add(e);
}
// ... many more simple methods
}
对于大多数 API,这很简单,但是查看 java.util.ArrayList 我发现,对于方法 iterator(),它返回与 listIterator() 不同的实现,尽管 ListIterator 扩展了它的 Iterator,但它没有添加任何新成员。
我想知道这背后是否有更深层次的原因 - 我计划简单地实现 iterator() 和 listIterator() 都返回相同类型的迭代器 - ListIterator。为什么不应该从 iterator() 方法返回 ListIterator 是否有任何合乎逻辑的理由?