ServiceLoader双迭代器问题

时间:2010-04-07 15:34:19

标签: java

这是一个已知问题吗?我无法找到任何搜索结果。

当迭代已在进行中迭代ServiceLoader时,第一次迭代将被中止。例如,假设至少有两个Foo的实现,以下代码将失败并出现AssertionError:

ServiceLoader<Foo> loader = ServiceLoader.load(Foo.class);
Iterator<Foo> iter1 = loader.iterator();
iter1.next();

Iterator<Foo> iter2 = loader.iterator();
while (iter2.hasNext()) {
    iter2.next();
}

assert iter1.hasNext();

如果第二个迭代器真正终止,这似乎只会发生。代码将在此变体中成功,例如:

ServiceLoader<Foo> loader = ServiceLoader.load(Foo.class);
Iterator<Foo> iter1 = loader.iterator();
iter1.next();

Iterator<Foo> iter2 = loader.iterator();
iter2.next();

assert iter1.hasNext();

这是一个错误还是一个功能? :P

在任何地方都有这张票?

1 个答案:

答案 0 :(得分:2)

这可能是一个错误。我认为是因为iterator.next()在内部的惰性迭代器的相同引用上调用next()。 这种行为违反了“最小惊讶原则”