MADAME
,
MADEMOISELLE
,
MONSIEUR
.
Exemple 38. Une première énumération
enum Civilite {MADAME, MADEMOISELLE, MONSIEUR} ; Civilite civilite = Civilite.MADAME ;
Civilite
(exactement comme si
Civilite
était d'une classe normale), et lui donne une valeur en suivant la syntaxe indiquée.
Notons qu'une énumération ne peut pas être locale (c'est-à-dire déclarée dans une méthode), et qu'elle ne peut pas être anonyme.
Déclarer une énumération de cette façon est possible, mais ne permet pas d'utiliser l'énumération
Civilite
ailleurs que dans la classe où elle est définie. Il est donc possible de déclarer une énumération dans un fichier séparé, comme une classe, en remplaçant simplement le mot-clé class par le mot-clé
enum
.
Exemple 39. Déclaration d'une énumération
public enum Civilite { // dans le fichier Civilite.java
MADAME, MADEMOISELLE, MONSIEUR
}
Enum
, qui elle-même étend la classe
Object
, comme toutes les classes en Java.
Les valeurs d'une énumération sont les seules instances possibles de cette classe. Dans notre exemple,
Civilite
comporte trois instances et trois seulement :
MADAME
,
MADEMOISELLE
,
MONSIEUR
. On peut donc comparer ces instances à l'aide d'un
==
de façon sûre, même si la comparaison à l'aide de la méthode
equals()
reste possible.
toString()
de cette classe énumération est surchargée : elle retourne une chaîne de caractères qui porte le nom de la constante considérée. Dans notre exemple :
System.out.println("Civilite : " + Civilite.MADAME) ; -> MADAME
toString()
a une méthode symétrique :
valueOf(String)
, qui retourne la valeur énumérée à parir de sa chaîne de caractères.
Il existe deux versions de cette méthode, toutes les deux statiques. La première est définie dans la classe énumération
Civilite
, voyons un exemple de son utilisation.
Civilite civilite = Civilite.valueOf("MONSIEUR") ; -> civilite prend la valeur Civilite.MONSIEURLa deuxième est définie dans la classe
Enum
, et prend le nom de l'énumération en paramètre.
Civilite civilite = Enum.valueOf(Civilite.class, "MONSIEUR") ; -> civilite prend la valeur Civilite.MONSIEUR
values()
retourne un tableau de toutes les valeurs énumérées disponibles.
Civilite[] civilites = Civilite.values() ;
ordinal()
permet de retrouver le numéro d'ordre d'un élément énuméré, dans la liste de tous les éléments d'une énumération. Le premier numéro d'ordre est 0.
Civilite civilite = Civilite.MADEMOISELLE ; System.out.println("Civilite : " + civilite + " [" + civilite.ordinal() + "]") ; > Civilite : MADEMOISELLE [1]
compareTo()
compare les numéros d'ordre de deux éléments énumérés. Si le premier élément est placé avant le deuxième dans la liste, alors l'entier retourné est négatif, sinon il est positif.
System.out.println(Civilite.MADAME.compareTo(Civilite.MONSIEUR)) ; > -2
MADAME
,
MADEMOISELLE
,
MONSIEUR
, une abréviation :
MME
,
MLLE
,
MR
.
Formellement, cela signifie qu'à chaque instance de la classe énumération
Civilite
, on souhaite associer une propriété, abréviation, qui prend une valeur particulière pour chacune de ces instances. La question est : dans la mesure où nous n'avons vu qu'une façon déclarative de créer une suite de valeurs énumérées, comment initialise-t-on ces instances ?
La réponse est apportée par le mécanisme des constructeurs privés. Il est possible, à l'intérieur d'une classe énumération, de définir un unique constructeur par instance, privé, dans lequel on peut procéder à toutes les initialisations que l'on veut.
Voyons ceci sur un exemple.
Exemple 40. Énumération : constructeurs privés
public enum Civilite { // dans le fichier Civilite.java MADAME("MME"), MADEMOISELLE("MLLE"), MONSIEUR("MR") ; private String abreviation ; private Civilite(String abreviation) { this.abreviation = abreviation ; } public String getAbreviation() { return this.abreviation ; } }
abreviation
sera correctement initialisé pour chacune des trois instances de notre classe.
On peut le constater en exécutant l'exemple suivante.
Civilite civilite = Civilite.MADEMOISELLE ; System.out.println("Civilite : " + civilite + " [" + civilite.getAbreviation() + "]") ; > Civilite : MADEMOISELLE [MLLE]Notons qu'il n'est pas possible de créer des constructeurs non privés dans une classe énumération.
EnumSet
est une classe abstraite fournie dans le but de créer des
Set
dont les éléments sont des objets énumérés. Elle propose un jeu de méthodes statiques, qui retournent toutes des instances de
EnumSet<E>
, où
E
désigne un type énuméré. Par exemple, le code suivant retourne un
Set
contenant l'ensemble des éléments de l'énumération
Civilite
.
Exemple 41. Création d'un
EnumSet
sur une énumération
EnumSet<Civilite> enumSet = EnumSet.allOf(Civilite.class) ;
String
StringBuffer
et
StringBuilder