«Бесконечный» итератор плохой дизайн? [закрыто]

Считается ли это плохой практикой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 как генератор значений из неограниченной последовательности?

Ответы на вопрос(11)

Ваш ответ на вопрос