【发布时间】:2013-03-24 18:54:37
【问题描述】:
从 Java 5 开始,我们有了新的 java.lang.Iterable 类型,可以在 foreach 循环中使用:
for (Object element : iterable);
Iterable 合约没有指定在处理 Iterable 之前是否可以多次调用其iterator() 方法。即,尚不清楚以下内容是否适用于所有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)?
【问题讨论】:
-
难道你不能在每次调用 iterator() 时增加 OneShotIterable 的一个字段,如果它是 gte n 则抛出异常?
-
@LukasEder doh 你把它编辑掉了