Les types énumérés
Définition et utilisation d’un type énuméré simple
La définition d’un type énuméré en Java utilise une syntaxe de la forme : enum NomType { valeur1, valeur2, … valeurN } soit, ici : enum Couleurs { rouge, bleu, vert, jaune } Notez que, bien que l’on emploie le mot-clé enum et non class, Couleurs est à considérer comme un classe particulière. Les valeurs du type (rouge, bleu, vert et jaune) en sont des instances finales (non modifiables). 2. La déclaration de variables du type Couleurs est classique : Couleurs c1, c2 ; On ne peut affecter à ces variables que des valeurs du type Couleurs. Ici, il peut s’agir de l’une des 4 constantes du type : on les nomme en les préfixant du nom de type (ici Couleurs) comme dans : c1 = Couleurs.bleu ; // attention : c1 = bleu serait erroné c2 = Couleurs.jaune ; 3. La comparaison de deux variables de type énuméré peut se faire indifféremment avec l’un des opérateurs == ou equals. Rappelons que le premier compare les références des objets correspondants, tandis que le second porte sur les valeurs de ces objets. Mais, comme il n’existe qu’un exemplaire de chaque objet représentant un constante d’un type énuméré, il revient bien au même de comparer leur référence ou leur valeur. De même, on peut utiliser indifféremment != ou !equals. if (c1 != c2) // ou if (! c1.equals(c2)) { Couleurs c ; c = c1 ; c1 = c2 ; c2 = c ; } 1. Définir un type énuméré nommé Couleurs dont les valeurs sont définies par les identificateurs suivants : rouge, bleu, vert, jaune. 2. Déclarer deux variables c1 et c2 du type Couleurs et leur affecter une valeur. 3. Échanger le contenu de ces deux variables, en s’assurant au préalable que leurs valeurs ne sont pas égales. 4. Regrouper toutes ces instructions dans une petit programme complet (on pourra ajouter des instructions d’affichage des valeurs des variables avant et après échange).
Itération sur les valeurs d’un type énuméré
On suppose qu’on dispose d’un type énuméré nommé Suite. Écrire un programme qui en affiche les différents libellés. Par exemple, si Suite a été défini ainsi (notez l’emploi du libellé ut, car do n’est pas utilisable puisqu’il s’agit d’un mot-clé) : enum Suite { ut, re, mi, fa, sol, la, si } Le programme affichera : Liste des valeurs du type Suite : ut re mi fa sol la si 84 geneli~1.book Page 117 Lundi, 10. juillet 2006 12:46 12 Les types énumérés Chapitre 7 118 © Éditions Eyrolles On peut facilement itérer sur les différentes valeurs d’un type énuméré à l’aide de la boucle dite for… each, introduite par le JDK 5.0. Il faut cependant au préalable créer un tableau des valeurs du type en utilisant la méthode values de la classe Enum ; l’expression Suite.values() représente un tableau formé des différentes valeurs du type Suite. En définitive, voici le programme voulu ; il fonctionne quelle que soit la définition du type Suite : public class TstSuite { public static void main (String args[]) { System.out.println( « Liste des valeurs du type Suite : » ) ; for (Suite s : Suite.values() ) System.out.println (s) ; // appel implicite de toString () } } enum Suite { ut, re, mi, fa, sol, la, si } Accès par leur rang aux valeurs d’un type énuméré (1) Une démarche simple consiste à créer un tableau des valeurs du type, à l’aide de la méthode values de la classe Enum. Il suffit ensuite d’exploiter classiquement ce tableau pour obtenir les informations voulues : public class TstValues { public static void main (String args[]) { // On crée un tableau des valeurs du type, à l’aide de la méthode values Suite[] valeurs = Suite.values () ; int nbVal = valeurs.length ; System.out.println (« le type Suite comporte » + nbVal + » valeurs » ) ; System.out.println (« valeurs de rang impair = « ) ; for (int i =0 ; i < nbVal ; i+=2) System.out.println (valeurs[i]) ; System.out.println (« derniere valeur du type : « ) ; System.out.println (valeurs[nbVal-1]) ; } enum Suite { ut, re, mi, fa, sol, la, si } On suppose qu’on dispose d’un type énuméré nommé Suite. Ecrire un programme qui : • affiche le nombre de valeurs du type, • affiche les valeurs de rang impair, • affiche la dernière valeur du type.
Lecture de valeurs d’un type énuméré
A priori, toute classe d’énumération dispose d’une méthode valueOf qui effectue la conversion inverse de toString, à savoir : convertir une chaîne en une valeur du type énuméré correspondant. Cependant, si la chaîne en question ne correspond à aucune valeur du type, on aboutit à une exception qui doit alors être interceptée, sous peine de voir le programme s’interrompre. Ici, nous vous proposons une démarche, moins directe, mais ne comportant plus de risque d’exception, à savoir : parcourir chacune des valeurs du type énuméré (à l’aide du tableau fourni par la méthode values) en comparant sa conversion en chaîne (toString) avec la chaîne fournie au clavier. public class LectureEnum { public static void main (String args[]) { String chSuite ; System.out.print(« Donnez un libelle de l’enumeration Suite : « ); chSuite = Clavier.lireString () ; boolean trouve = false ; for (Suite j : Suite.values()) { if (chSuite.equals(j.toString() ) ) { trouve = true ; int numSuite = j.ordinal() ; System.out.println(chSuite + » correspond a la valeur de rang » + (numSuite+1) + » du type Suite » ); } } On suppose qu’on dispose d’un type énuméré nommé Suite. Écrire un programme qui lit une chaîne au clavier et qui indique si cette chaîne correspond ou non à un libellé du type et qui, le cas échéant, en affiche le rang dans les valeurs du type.s if (!trouve) System.out.println (chSuite + » n’appartient pas au type Suite ») ; } } enum Suite {ut, re, mi, fa, sol, la, si } Donnez un libelle de l’enumeration Suite : Re Re n’appartient pas au type Suite Donnez un libelle de l’énumération Suite : mi mi correspond a la valeur de rang 3 du type Suite.