这是一个已知问题吗?我无法找到任何搜索结果。
当迭代已在进行中迭代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 :(得分:2)
这可能是一个错误。我认为是因为iterator.next()在内部的惰性迭代器的相同引用上调用next()。 这种行为违反了“最小惊讶原则”