如果不是出于性能问题,我建议您不要尝试创建另一个 Collection 实现。Collections.unmodifiableCollection()Java 已经通过该方法提供了集合的只读视图。如果您想继续使用 Guava,则ImmutableList和ImmutableSet是ImmutableMap您要检查的课程。要确定大小,您可以使用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可以优化。