Вы абсолютно должны иметь возможность использовать итератор, только вызывая next()
, предполагая, что он находится в допустимом для вас состоянии. Проверка hasNext()
на каждой итерации - идиоматический способ сделать что-то, но это не обязательно, и вы не должны полагаться на вызывающих абонентов, делающих это.
На самом деле, hasNext()
должен быть идемпотентом и, по сути, не должен вообще изменять какое-либо состояние вашего итератора. Поскольку он не меняет состояние, по определению он не может измениться, независимо от того, был ли он ранее вызван или нет.
Так что, в основном, да - каждый раз, когда вызывается next()
, вы должны возвращать «текущий» элемент вашего итератора, а затем добавлять «указатель» (независимо от того, что эти понятия означают в вашей реализации).
Что бы произошло, если бы у пользователя было несколько последовательных вызовов next () без hasNext ()?
Если бы оставалось достаточно элементов для итерации, он получал бы последовательные элементы, возвращаемые при каждом вызове next()
. Если он думает, что знает лучше, и вызывает next()
после достижения конца итератора (то есть, когда hasNext()
вернул бы false), тогда согласно Javadocs вы должны бросить NoSuchElementException
.