Il est généralement considéré comme une mauvaise pratique à offrir Iterator
des implémentations qui sont "à l'infini"; c'est à dire où les appels à l' hasNext()
(*) return true?
En général, je dirais "oui", parce que le code appelant pouvait se comporter de façon erratique, mais dans le dessous de la mise en œuvre hasNext()
renvoie la valeur true à moins que l'appelant supprime tous les éléments de la Liste que l'itérateur a été initialisé avec; c'est à dire il y a une condition de résiliation. Vous pensez que c'est une utilisation légitime de la Iterator
? Il ne semble pas violer le contrat, bien que je suppose que l'on pourrait faire valoir qu'il est peu intuitive.
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();
}
}
(Pédant) MODIFIER
Certaines personnes ont commenté la façon dont un Iterator
pourrait être utilisé pour générer des valeurs à partir d'une surabondance de la séquence telle que la suite de Fibonacci. Cependant, la Java Iterator
documentation, un Itérateur est:
Un itérateur sur une collection.
Maintenant, on pourrait dire que la suite de Fibonacci est une collection infinie, mais en Java je équivaudrait collection avec l' java.util.Collection
interface, qui propose des méthodes telles que l' size()
ce qui signifie que la collection doit être limitée. Donc, est-il légitime d'utiliser Iterator
comme un générateur de valeurs à partir d'une surabondance de la séquence?