Проблемы двойного итератора ServiceLoader - PullRequest
4 голосов
/ 07 апреля 2010

Это известная проблема? У меня были проблемы с поиском результатов поиска.

При выполнении итерации по 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();

Это ошибка или особенность? : Р

Билет на это уже есть где-нибудь?

1 Ответ

2 голосов
/ 07 апреля 2010

Это может быть ошибкой.Я думаю, что так как iterator.next () вызывает next () для той же ссылки ленивого итератора внутри.Такое поведение нарушает «Принцип наименьшего удивления»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...