tags:

views:

58

answers:

1

Is this a known issue? I had trouble finding any search results.

When iterating over a ServiceLoader while an iteration already is in progress, the first iteration will be aborted. For example, assuming there are at least two implementations of Foo, the following code will fail with an 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();

This only seems to occur, if the second iterator really terminates. The code will succeed in this variation for example:

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

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

assert iter1.hasNext();

Is this a bug or a feature? :p

Is there a ticket for this already anywhere?

+1  A: 

This could be a bug. I think it is since iterator.next() invokes next() on same reference of a lazy iterator internally. This behavior violates "Principle of least astonishment"

ring bearer
@ring: that's a very possible reason, but how is that not a bug? Nothing in the documentation suggests that you may only call `iterator()` once or that multiple `Iterators` depend on each other in some way.
Joachim Sauer
This could be a bug, edited my response. I was rather thinking why would one want to have multiple iterators on the ServiceLoader.This violates "Principle of least astonishment " comparing to `Iterators` elsewhere in Java
ring bearer