我想在 Java 中实现一个可迭代的不可变类。我这样做是通过以下方式:
public final class MyIterable implements Iterable<Integer> {
private final Collection<Integer> items;
public MyIterable(Collection<Integer> items) {
this.items = Collections.unmodifiableCollection(new LinkedList<Integer>(items));
}
@Override
public Iterator<Integer> iterator() {
return items.iterator();
}
}
这一切都很好,我无法在我的实例中更改任何内容。但是,我的类仍然公开了一个 API,表明它的内部可以通过迭代器上的 remove() 方法进行修改:
MyIterable myIterable = new MyIterable(Arrays.asList(1, 2, 3));
for (Iterator<Integer> it = myIterable.iterator(); it.hasNext();) {
it.remove(); // I do not want to expose this even
// though I know it will throw an error at runtime.
it.next();
}
有什么方法可以避免暴露这个 remove 方法,从而让我的类暴露一个真正不可变的 API?理想的做法是实现类似的东西ReadOnlyIterable
,但类似的东西在 Java 中似乎不可用。