我想构建一个传递迭代器和大小的数据模型,基本上是迭代结果集元素的只读方式。
我想扩展ImmutableCollection并实现size()和iterator()是最好的行动方案,因为这种类型充分传达了我的意图。
不幸的是,ImmutableCollection有一个package-private isPartialView。
我的问题:为什么isPartialView包是私有的,如果它仍然如此,如果是这样,那么建模我的只读集合的最佳方法是什么?我应该只使用size()和iterator()方法(SizedIterable)创建自定义类型吗?这个用例还有其他建议吗?
答案 0 :(得分:4)
如果不是出于性能问题,我建议您不要尝试创建另一个Collection实现。 Java已使用Collections.unmodifiableCollection()
方法提供了该集合的只读视图。如果您想留在Guava,ImmutableList
,ImmutableSet
和ImmutableMap
是您想要查看的课程。要确定大小,可以使用Guava中的Iterables.size()
方法。
如果存在性能问题,那么使用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());
}
}
假设addAll
和removeAll
未被使用,或者通过add
和remove
来电,可以缓存大小也是可能的基于委托方法的返回值实现。但是有其他限制,例如如果仅用于列表,则可以优化addAll
。
答案 1 :(得分:3)
Collection界面中的许多操作都被视为可选操作。您可以在其上编写自己的实现,并为您的实现不支持的任何操作抛出UnsupportedOperationException。这将是一种绕过必须扩展ImmutableCollection的方法。
子类化ImmutableCollection可能不是一个选项,因为其文档说明如下:
不可变的集合。不允许使用null元素。
注意:尽管此类不是最终的,但它不能在此包之外进行子类化,因为它没有公共或受保护的构造函数。因此,这种类型的实例保证是不可变的。