0

我有一个类ContainedObject,它的实例应该包含在ArrayList.

public class ContainedObject {
    private ContainerArrayList<ContainedObject> containningArrayList;
    public ContainerArrayList<ContainedObject> getContainningArrayList() {
        return containningArrayList;
    }
    public void setContainningArrayList(ContainerArrayList<ContainedObject> list) {
        containningArrayList = list;
    }
}

现在,我想以ArrayList这样一种方式扩展getContainningArrayList()它包含的对象将反映它们的“容器”。例如,我add()以这种方式覆盖:

public class ContainerArrayList<ContainedObject> extends ArrayList<ContainedObject> {
    @Override
    public boolean add(ContainedObject e) {
        e.setContainningArrayList(this);
        return super.add(e);
    }
}

到目前为止,一切都很好。问题是,我还希望能够调用ContainerArrayList复制构造函数和clone方法等,并保持相同的包含反射。所以我的问题是——我应该重新实现这些方法中的每一个,还是它们以某种方式相互调用(即ArrayList(ArrayList)用于add构造新的arraylist)。

有什么线索吗?

4

1 回答 1

0

如果您想要描述的行为,您必须覆盖克隆方法或创建一个自定义构造函数(或两者),将 Collection 作为参数。使用默认方法会使您的自定义对象指向旧的containsArrayList

你可以在 ArrayList 源代码中看到事情是如何工作的:

public ArrayList(Collection<? extends E> c) {
    elementData = c.toArray();
    size = elementData.length;
    // c.toArray might (incorrectly) not return Object[] (see 6260652)
    if (elementData.getClass() != Object[].class)
        elementData = Arrays.copyOf(elementData, size, Object[].class);
}

public Object clone() {
    try {
        @SuppressWarnings("unchecked")
        ArrayList<E> v = (ArrayList<E>) super.clone();
        v.elementData = Arrays.copyOf(elementData, size);
        v.modCount = 0;
        return v;
    } catch (CloneNotSupportedException e) {
        // this shouldn't happen, since we are Cloneable
        throw new InternalError();
    }
}
//Arrays.copyOf returns a copy of the original array, truncated or padded with nulls to obtain the specified length

还可以考虑将 ContainedObject 转为接口。

于 2013-07-22T18:52:06.543 回答