这是一个已知的问题吗?我很难找到任何搜索结果。
当迭代已经在进行的同时在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();这是一个bug还是一个特性?:p
已经有门票了吗?
发布于 2010-04-07 23:48:33
这可能是个bug。我认为这是因为iterator.next()在内部对惰性迭代器的同一引用调用next()。这种行为违反了“最小惊讶原则”。
https://stackoverflow.com/questions/2593777
复制相似问题