扩展ImmutableCollection

时间:2013-08-16 20:00:58

标签: java guava

我想构建一个传递迭代器和大小的数据模型,基本上是迭代结果集元素的只读方式。

我想扩展ImmutableCollection并实现size()和iterator()是最好的行动方案,因为这种类型充分传达了我的意图。

不幸的是,ImmutableCollection有一个package-private isPartialView。

我的问题:为什么isPartialView包是私有的,如果它仍然如此,如果是这样,那么建模我的只读集合的​​最佳方法是什么?我应该只使用size()和iterator()方法(SizedIterable)创建自定义类型吗?这个用例还有其他建议吗?

2 个答案:

答案 0 :(得分:4)

如果不是出于性能问题,我建议您不要尝试创建另一个Collection实现。 Java已使用Collections.unmodifiableCollection()方法提供了该集合的只读视图。如果您想留在Guava,ImmutableListImmutableSetImmutableMap是您想要查看的课程。要确定大小,可以使用Guava中的Iterables.size()方法。

如果存在性能问题,那么使用ForwardingCollectionUnmodifiableIterator实施该方案可能会有利。例如:

public static class CollectionWithUnmodifiableIterator<E> extends ForwardingCollection<E> {
    private final Collection<E> collection;
    public CollectionWithUnmodifiableIterator(final Collection<E> collection) {
        this.collection = collection;
    }
    @Override
    protected Collection<E> delegate() {
        return collection;
    }
    @Override
    public Iterator<E> iterator() {
        return Iterators.unmodifiableIterator(super.iterator());
    }
}

假设addAllremoveAll未被使用,或者通过addremove来电,可以缓存大小也是可能的基于委托方法的返回值实现。但是有其他限制,例如如果仅用于列表,则可以优化addAll

答案 1 :(得分:3)

Collection界面中的许多操作都被视为可选操作。您可以在其上编写自己的实现,并为您的实现不支持的任何操作抛出UnsupportedOperationException。这将是一种绕过必须扩展ImmutableCollection的方法。

子类化ImmutableCollection可能不是一个选项,因为其文档说明如下:

  

不可变的集合。不允许使用null元素。

     

注意:尽管此类不是最终的,但它不能在此包之外进行子类化,因为它没有公共或受保护的构造函数。因此,这种类型的实例保证是不可变的。