«Бесконечный» итератор плохой дизайн? [закрыто]
Считается ли это плохой практикойIterator
реализации, которые являются "бесконечными"; то есть где звонкиhasNext()
всегда (*) возвращать истину?
Как правило, я бы сказал «да», потому что вызывающий код может работать неправильно, но в приведенной ниже реализации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();
}
}
(Педантичный) РЕДАКТИРОВАТЬ
Некоторые люди прокомментировали, какIterator
может использоваться для генерации значений из неограниченной последовательности, такой как последовательность Фибоначчи. Тем не менее, JavaIterator
В документации говорится, что Итератор это:
Итератор над коллекцией.
Теперь можно утверждать, что последовательность Фибоначчи представляет собой бесконечную коллекцию, но в Java я бы отождествил коллекцию сjava.util.Collection
интерфейс, который предлагает такие методы, какsize()
подразумевая, что коллекция должна быть ограниченной. Следовательно, законно ли использоватьIterator
как генератор значений из неограниченной последовательности?