Types énumérés (enums)

images/whitebelt.png

Supposons que l’on ait des définitions de constante comme:

   public static final int PRIORITE_BASSE=0 ;
   public static final int PRIORITE_NORMALE=1 ;
   public static final int PRIORITE_HAUTE=2 ;

et que ces constantes puissent être utilisées par un code comme

public class Courrier {
   public void envoi(String message, int priorité) {
      // code
   }
}

Que va-t’il se passer si un code appelant invoque cette méthode avec, par inadvertance, un paramètre priorité qui vaut 3?

Pour sécuriser ce code il faudrait être sûr d’avoir un paramètre appartenant à une liste finie d’objets représentant une priorité. C’est typiquement le rôle d’un type énuméré.

Les énumérés les plus simples sont une liste ordonnée de symboles:

Definition d’un énuméré simple. 

public enum  Urgence {
   BASSE , NORMALE, HAUTE ;
}

Le code ci-dessus deviendrait:

public class Courrier {
   public void envoi(String message, Urgence priorité) {
      // code
   }
}

et un code appelant:

   poste.envoi(monMessage, Urgence.NORMALE) ;

autre utilisation d’un énuméré simple. 

   Urgence priorité = Urgence.HAUTE ;
        System.out.println(priorité.compareTo(Urgence.NORMALE)); // renvoie 1
   // la méthode +compareTo+ renvoie un entier positif si l'objet est
   // situé "après" dans l'ordre des symboles
   // Bien que non définie dans le code
   // cette méthode est valide pour tous les enums

En Java un enum définit une classe pour laquelle une liste finie d’instance existe. Ces instances sont définies dans le code de la classe elle-même.

Definition d’un enum avec une liste d’instances. 

public enum  TauxTaxe{
   // liste des instances légales
   REDUIT(5.5) , NORMAL(19.6), LUXE(33.3) ;

   final double valeur ; // Champ d'instance

   // ce constructeur NE FAIT PAS PARTIE DE l'A.P.I.
   // seul le code de la classe peut créer des instances légales

   TauxTaxe(double vl) { this.valeur = vl ; }

   public double getValeur() { return this.valeur ; }
}

Exemples de codes utilisant ce type:

   double prix =  montant * TauxTaxe.NORMAL.getValeur() ;
   ///
   String nomTaux ;
   // initialisé à "REDUIT" or "NORMAL" or "LUXE"
   TauxTaxe tauxCourant = TauxTaxe.valueOf(nomTaux) ;
   // bien que non définie dans le code cette méthode est ok pour tout enum

--exercice sur enum--

--un exercice final pour l’ensemble du chapitre--