0

我在代码中有很多实例,其中集合,通常是从方法返回的列表,并且考虑到调用者可能会更改该列表,因此制作了防御性副本。

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 是否有任何合乎逻辑的理由?

4

1 回答 1

1

ListIterator 扩展了迭代器。因此,如果您返回一个实现 ListIterator 的对象,那么它显然也实现了 Iterator。但是您也可以决定返回仅实现 Iterator 的不同对象,因为实现可能更有效。决定权在你。

于 2013-11-23T18:58:19.687 回答