Обычно считается, что плохая практика обеспечивает Iterator
реализации, которые являются "бесконечными"; т.е. когда вызовы hasNext()
всегда (*) возвращают true?
Обычно я бы сказал "да", потому что вызывающий код мог вести себя беспорядочно, но в приведенной ниже реализации hasNext()
будет возвращать true, если вызывающий объект не удалит все элементы из списка, которые инициализировали итератор; то есть существует условие завершения. Считаете ли вы, что это законное использование Iterator
? Это, похоже, не нарушает контракт, хотя я полагаю, что можно было бы утверждать, что это неинтуитивно.
public class CyclicIterator<T> implements Iterator<T> {
private final List<T> l;
private Iterator<T> it;
public CyclicIterator<T>(List<T> l) {
this.l = l;
this.it = l.iterator();
}
public boolean hasNext() {
return !l.isEmpty();
}
public T next() {
T ret;
if (!hasNext()) {
throw new NoSuchElementException();
} else if (it.hasNext()) {
ret = it.next();
} else {
it = l.iterator();
ret = it.next();
}
return ret;
}
public void remove() {
it.remove();
}
}
(Pedantic) EDIT
Некоторые люди прокомментировали, как Iterator
можно использовать для генерации значений из неограниченной последовательности, такой как последовательность Фибоначчи. Однако в документации Java Iterator
указано, что Iterator:
Итератор над коллекцией.
Теперь вы можете утверждать, что последовательность Фибоначчи представляет собой бесконечную коллекцию, но в Java я бы приравнивал коллекцию к интерфейсу java.util.Collection
, который предлагает такие методы, как size()
, подразумевая, что коллекция должна быть ограничена. Поэтому допустимо ли использовать Iterator
как генератор значений из неограниченной последовательности?