Bien que l'on utilise généralement les itérateurs fournis par les collections, il est parfois nécessaire d'en définir un. Prenons l'exemple du type Feu (voir § 3.5) et définissons un itérateur qui énumère de façon cyclique ses trois constantes Feu.ROUGE, Feu.ORANGE et Feu.VERT.
On ajoute à la classe Feu une fonction cycle() qui
retourne un itérateur. Celui-ci est défini comme une instance d'une
classe anonyme (voir § 5.2, page ) qui réalise
l'interface Iterator. Cette instance a un champ privé
curseur qui garde en mémoire une position entre deux
invocations de next. Comme on veut une énumération cyclique
(figure 6.7, la méthode hasNext retourne toujours
true. Dans next, le cas par défaut, qui est de
déclencher l'exception NoSuchElementException, ne devrait pas
se produire. La méthode remove déclenche toujours l'exception
UnsupportedOperationException.
import java.util.Iterator; import java.util.NoSuchElementException; class Feu { // ... static Iterator cycle() { return new Iterator() { private int curseur = 0; public boolean hasNext() { return true; } public Object next() { switch (curseur) { case 0: curseur = 1; return VERT; case 1: curseur = 2; return ORANGE; case 2: curseur = 0; return ROUGE; default: throw new NoSuchElementException(); } } public void remove() { throw new UnsupportedOperationException(); } }; } public static void main(String[] args) { Iterator c = Feu.cycle(); for (int i=0; i<10; i++) { System.out.println(c.next()); } } }
L'effet de ce programme est d'afficher :
VERT ORANGE ROUGE VERT ORANGE ROUGE VERT ORANGE ROUGE VERT