next up previous contents index
suivant: Itération sur les chaînes monter: Itérateurs précédent: Itérer sur une table   Table des matières   Index

Réalisation d'un itérateur1#1

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.


252#252

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



Rene' LALEMENT 2002-11-07