Java a introduit les énumérations dans sa version 1.5. Les développeurs PHP trouveront une correspondance avec les tableaux. Cependant, les possibilités offertes par Java sont beaucoup plus larges.
Une énumération en Java est représentée par le mot-clé enum. Elle ressemble plus à une classe qu'un type primitif. Elle hérite de la classe java.lang.Enum et contient une liste des sous-objets dont le comportement peut être librement adapté. Regardons cela sur un exemple :
public class EnumExemple { private Pupils pupil; private enum Pupils { ELODIE("Elodie", 20), MICKAEL("Mickael", 10), ANNE("Anne", 15), MARINE("Marine", 12); private String name; private int note; private Pupils(String n, int i) { name = n; note = i; } public String getName() { return name; } public int getNote() { return note; } } public static void main(String[] args) { EnumExemple enEx = new EnumExemple(Pupils.ANNE); System.out.println("Elodie's note is " + Pupils.ELODIE.getNote()); switch(enEx.pupil) { case ELODIE: System.out.println("Elodie found"); break; case ANNE: System.out.println("Anne found"); break; default: System.out.println("Nobody found"); break; } } public EnumExemple(Pupils p) { pupil = p; } }
On verra le résultat suivant sur l'écran :
Elodie's note is 20
Anne found
Qu'est-ce qu'on constate ? On remarque tout de suite que la construction de l'enum ressemble énormément à celle d'une classe. L'énumération possède bien un constructeur ainsi que d'autres méthodes auxquelles on peut accéder depuis son extérieur. Il faut bien noter que le constructeur de l'enum doit être privé. Grâce à cela, les constantes incluses au début (en occurence : ELODIE("Elodie", 20), MICKAEL("Mickael", 10), etc.) sont tout de suite initialisées et il est impossible d'en créer d'autres.
Les avantages d'utiliser enum en Java
Quels sont donc les points positifs de l'utilisation du type enum ? Tout d'abord il est type-safe. Cela veut dire qu'il possède son propre espace de nom et ne peut pas contenir une autre valeur que celles spécifiées pendant l'initialisation.
Un autre avantage est la possibilité d'utiliser les énumérations dans les constructions switch-case, tout comme les int.
Contrairement aux tableaux, enum est un type beaucoup plus puissant. Comme déjà évoqué, il ressemble à une classe. Il possède donc un constructeur et d'autres méthodes qui permettent une manipulation facile des valeurs. Il peut également surcharger des fonctions de la classe Object comme par exemple toString().
L'énumération peut ausssi implémenter des interfaces (par exemple Runnable) ainsi que contenir des méthodes abstraites.
Constatons tout ces avantages sur notre premier exemple largement modifié :
public class EnumExemple { private Pupils pupil; private enum Pupils implements Runnable { ELODIE("Elodie", 20) { public boolean isWomen() { return true; } }, MICKAEL("Mickael", 10) { public boolean isWomen() { return false; } }, ANNE("Anne", 15) { public boolean isWomen() { return true; } }, MARINE("Marine", 12) { public boolean isWomen() { return true; } }; private String name; private int note; private Pupils(String n, int i) { name = n; note = i; } public abstract boolean isWomen(); public String getName() { return name; } public int getNote() { return note; } public void run() { System.out.println("Pupils enum ("+name+")is running"); } } public static void main(String[] args) { EnumExemple enEx = new EnumExemple(Pupils.ANNE); System.out.println("Elodie's note is " + Pupils.ELODIE.getNote()); switch(enEx.pupil) { case ELODIE: System.out.println("Elodie found"); break; case ANNE: System.out.println("Anne found"); break; default: System.out.println("Nobody found"); break; } System.out.println("Is Mickael a women ? " + Pupils.MICKAEL.isWomen()); System.out.println("Is Elodie a women ? " + Pupils.ELODIE.isWomen()); Thread t1 = new Thread(Pupils.ELODIE); t1.run(); } public EnumExemple(Pupils p) { pupil = p; } }
Voici le résultat :
Elodie's note is 20
Anne found
Is Mickael a women ? false
Is Elodie a women ? true
Pupils enum (Elodie)is running
La définition des constantes a changé. Elle a été enrichie par les alocades qui contiennent la méthode isWomen surchargée. On remarque également la présence de l'implémentation de l'interface Runnable qui permet de lancer l'enum dans un nouveau Thread.