从Java 5开始,我们有了新的 java.lang.Iterable
类型,可以在foreach循环中使用,例如:
for (Object element : iterable);
Iterable
契约(Contract)未指定在处置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
而言,这是无关紧要的,因为它们实际上是经过 retrofit 的Collection API类型,例如List
,Set
,它们已经为iterator()
方法定义了明确的约定。我的问题是:我的
OneShotIterable
实现是否违反了我忽略的某些契约(Contract)?换句话说,Iterable
的用户会期望它可重用吗?如果是这样,Java 5专家组是否提出“官方”建议,如何处理这种“一次性”的Iterables
(例如,在第二次调用时抛出IllegalStateException
)? 最佳答案
我可以在标准库中找到的一个先例是 DirectoryStream
接口(interface)。
它的Javadoc包含以下段落(强调它们的段落):
对我来说,这表明两件事:
Iterable
上的隐含约定是,您应该能够多次(可能甚至同时)进行迭代。IllegalStateException
的警告,可能是在您自己的类/接口(interface)中处理违规行为的最佳方法。 关于java - 是否有关于多次使用的Iterable接口(interface)的正式契约(Contract)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15781739/