从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类型,例如ListSet,它们已经为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/

    10-11 20:43
    查看更多