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.
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 :
Les types énumérés étendent toujours la classe java.lang.Enum. Les éléments énumérés ne sont rien d'autres que des instances de © Charon Irène Télécom ParisTech 2011
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 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.