java – 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

在任何地方都有票吗?

最佳答案 这可能是一个错误.我认为是因为iterator.next()在内部的惰性迭代器的相同引用上调用next().

这种行为违反了“最不惊讶的原则”

点赞