从 Java 5 开始,我们有了java.lang.Iterable
可以在 foreach 循环中使用的新类型:
for (Object element : iterable);
Iterable
合约没有指定iterator()
在处理 Iterable 之前是否可以多次调用它的方法。即,尚不清楚以下内容是否适用于所有人Iterables
:
for (Object element : iterable);
for (Object element : iterable);
例如,一个Iterator
包装实现不能被使用两次:
public class OneShotIterable<T> implements Iterable<T> {
private final Iterator<T> it;
public OneShotIterable(Iterator<T> it) {
this.it = it;
}
@Override
public Iterator<T> iterator() {
return it;
}
}
对于大多数人来说Iterables
,这无关紧要,因为它们实际上是经过改造的 Collection API 类型,例如List
, Set
,它们的iterator()
方法已经有了明确定义的契约。
我的问题是:我的OneShotIterable
实施是否违反了我忽略的某些合同?换句话说,用户会Iterable
期望它是可重用的吗?如果是这样,Java 5 专家组是否有“官方”建议如何处理这种“一次性” (例如在第二次调用时Iterables
抛出)?IllegalStateException