用于Serializable类的writeObject和readObject方法,它扩展了ArrayList <e> </e>

时间:2013-06-08 14:08:13

标签: java collections

我想扩展ArrayList类以创建一个不包含重复元素的集合,并在内部使用数组来存储。 SetUniqueList存储唯一元素,但我想添加更多功能。

我陷入方法writeObjectreadObject。这是ArrayList中的实现:

private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{
    int expectedModCount = modCount;
    s.defaultWriteObject();

    s.writeInt(elementData.length);

    for (int i=0; i<size; i++)
        s.writeObject(elementData[i]);

    if (modCount != expectedModCount) {
        throw new ConcurrentModificationException();
    }

}

private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException {
    s.defaultReadObject();

    int arrayLength = s.readInt();
    Object[] a = elementData = new Object[arrayLength];

    for (int i=0; i<size; i++)
        a[i] = s.readObject();
}

显然我无法访问private transient Object[] elementData;。我很困惑,我应该创建像ArrayList这样的课程,而不是扩展它,或者还有其他任何一种艺术方法可以做到这一点吗?

更新

我需要使用subList,以便子列表中的更改会反映在此列表中。

1 个答案:

答案 0 :(得分:1)

我可以考虑在readObject的子类上实现writeObjectArrayList的几种方法:

  • 使用反射来调用ArrayList中的私有方法(讨厌!!但可能是合理的。)。

  • 使用super.iterator() etctera迭代readObject方法中的元素。


但是,我认为最好将ArrayList的子类转换为将操作委派给真实ArrayList的包装类。只需确保包装类为Serializable,并且包含对包装列表的引用的私有变量未标记为transient。)

LinkedHashSet可能是另一种选择......取决于如何使用该集合。