Les types énumérés

     

Un type énuméré permet de définir un ensemble d'identificateurs pour des constantes ; il peut permettre par exemple de définir l'ensemble : LUNDI, MARDI, ... pour les jours de la semaine. Jusqu'à la version 5.0, le langage Java ne permettait pas de définir un tel type. Avec le JDK 5.0, on peut définir des types énumérés à l'aide de classes. Ces classes diffèrent des classes traditionnelles ; en particulier, leur en-tête commence par le mot enum à la place du mot class. Nous donnons deux exemples. Le premier est suffisant pour un usage simple d'un type énuméré et le second permet de mieux comprendre ce type et ses possibilités.

Premier exemple

La classe Jour du premier exemple consiste uniquement en une énumération d'identificateurs pour les jours de la semaine. Cette énumération doit nécessairement être en première ligne (sauf d'éventuels commentaires) de la définition de la classe. Une méthode main utilise la classe Jour ; on y utilise une instruction par cas selon les jours de la semaine.

public enum Jour {
LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE;
}
class EssaiJour {
public static void main(String[] arg) {
Jour jour = Jour.valueOf(arg[0]);
if (jour == Jour.SAMEDI) System.out.print("fin de semaine : ");
switch(jour) {
case SAMEDI :
case DIMANCHE :
System.out.println("se reposer");
break;
default :
System.out.println("travailler");
break;
}
}
}
Pour la commande java EssaiJour SAMEDI, on obtient :
    fin de semaine : se reposer

Les classes pour les types énumérés étendent toujours la classe java.lang.Enum, sans que cela figure explicitement. En conséqence, puisque Java ne permet pas l'héritage multiple, une telle classe ne peut pas étendre une autre classe . Les éléments énumérés ne sont rien d'autres que des instances de la classe enum concernée ; il n'est pas possible de construire ultérieurement d'autres instances que celles énumérées immédiatement dans la définition. On peut définir un constructeur comme dans l'exemple ci-dessous. La classe java.lang.Enum possède des méthodes dont héritent les types énumérés ; en particulier, la méthode toString renvoie le nom de l'item.

Second exemple

Le second exemple propose plus de possibilités. On définit enum JourPlus. On y énumère encore les jours de la semaine. Un constructeur permet d'associer à un jour de la semaine une valeur (un nombre d'heures de travail) ; on ajoute une méthode, la méthode action, qui peut s'appliquer à toute instance de type JourPlus.
public enum JourPlus {
LUNDI(8), MARDI(8), MERCREDI(4), JEUDI(8), VENDREDI(7), SAMEDI(0), DIMANCHE(0);

private int nbHeures;

public JourPlus(int nb) {
nbHeures = nb;
}

public int getNbHeures() {
return nbHeures;
}

public String action() {
switch(this) {
case SAMEDI : return "cinema";
case DIMANCHE : return "dormir";
default : return "travailler";
}
}
}

class EssaiJourPlus {
public static void main(String[] arg) {
JourPlus unJour = JourPlus.SAMEDI;

System.out.println("numero de " + unJour + " : " + unJour.ordinal());
System.out.println(unJour + " : " + unJour.action());

for (JourPlus jour : JourPlus.values())
System.out.println("nombre d'heures de " + jour + " : " + jour.getNbHeures());
}
}
Pour la commande java EssaiJourPlus, on obtient :
numero de SAMEDI : 5
SAMEDI : cinema
nombre d'heures de LUNDI : 8
nombre d'heures de MARDI : 8
nombre d'heures de MERCREDI : 4
nombre d'heures de JEUDI : 8
nombre d'heures de VENDREDI : 7
nombre d'heures de SAMEDI : 0
nombre d'heures de DIMANCHE : 0

Les programmes


public enum Jour : il s'agit de l'en-tête de la classe ; le mot réservé enum est obligatoire et Jour est le nom du type énuméré.
LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE; : il s'agit de l'énumération des constantes.
Jour.valueOf(arg[0]) : renvoie l'objet de l'énumération dont le nom est donné en argument sous forme d'une chaîne de caractères.
jour == Jour.SAMEDI : SAMEDI s'utilise comme une constante statique de type Jour ; d'autre part, on peut toujours comparer comme ici des valeurs de types énumérés avec == sans faire appel à la méthode equals.
switch(jour) : l'instruction switch est possible avec un type énuméré, comme le montre l'exemple ; en dehors des types énumérés, on ne peut utiliser l'instruction switch qu'avec des types entiers.
SAMEDI : dans l'instruction switch , les items de type Jour sont obligatoirement indiqués directement, sans mettre par exemple Jour.SAMEDI.
public JourPlus(int nb) : on peut définir un constructeur. Lorsqu'on déclare la liste énumérée, on doit alors mettre des arguments destinés au(x) constructeur(s), comme on le voit sur l'exemple.
public String action() : on peut définir des méthodes, statiques ou d'instance.
unJour.ordinal() : la méthode ordinal est une méthode définie dans la classe java.lang.Enum et qui renvoie le numéro d'ordre dans l'énumération, en commençant à la valeur 0.
for (JourPlus jour : JourPlus.values()) : on remarque ici une façon de définir la boucle for pour un type énuméré ; la variable jour prend successivement toutes les valeurs énumérées dans le type JourPlus.

© Charon Irène Télécom ParisTech 2011