2010-04-07 78 views
4

这是已知问题吗?我无法找到任何搜索结果。ServiceLoader双迭代器问题

当迭代已经进行时迭代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

这是否有票已经在任何地方?

+0

您是否尝试过搜索错误数据库? – 2010-04-07 15:44:14

+0

是的,但没有发现任何东西 – buge 2010-04-07 15:51:52

+0

因此,在没有错误报告的情况下查找错误时,正常的行为方式是提交错误报告。 – 2010-04-07 17:50:53

回答

2

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

+3

@ring:这是一个非常可能的原因,但这不是一个错误?文档中没有任何内容表明你只能调用'iterator()'或者多个'Iterator'以某种方式相互依赖。 – 2010-04-07 15:51:17

+0

这可能是一个错误,编辑我的回复。我在想为什么要在ServiceLoader上有多个迭代器。 与Java中其他地方的'Iterators'相比,这违反了“最少惊人的原则” – 2010-04-07 16:04:25

+0

大约一年后,Sun^H^H^H Oracle仍未审查我提交的错误。我已经将答案标记为已接受的答案。 – buge 2011-01-11 07:53:37