4

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

我认为扩展 ImmutableCollection 并实现 size() 和 iterator() 是最好的做法,因为这种类型充分传达了我的意图。

不幸的是,ImmutableCollection 有一个包私有的 isPartialView。

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

4

2 回答 2

4

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

如果存在性能问题,则使用ForwardingCollection和实施该方案UnmodifiableIterator可能是有利的。例子:

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());
    }
}

缓存大小也是可能的,假设addAllandremoveAll没有被使用,或者它们通过addandremove调用汇集,其中可以根据委托方法的返回值实现内务管理。但是有其他限制,例如,如果仅用于列表,则addAll可以优化。

于 2013-08-16T20:26:18.963 回答
3

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

子类化 ImmutableCollection可能不是一种选择,因为它的文档说明如下:

一个不可变的集合。不允许空元素。

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

于 2013-08-16T20:06:05.197 回答