Chapitre 9 Les énumérations Les énumérations : Définition Une énumération est un ensemble fini de constantes. Exemple : public enum Jours { LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE La déclaration d'une énumération crée un nouveau type dont une variable ne peut prendre qu'une des constantes de l'énumération. Exemple : Jours j=jours.vendredi; Le nom de l'énumération précède toujours ses constantes sauf dans le cas d'un Switch Java - Dr A. Belangour 429 1
Les énumérations : Exemple public class TestEnum { private Jours jour; public TestEnum(Jours jour) { this.jour = jour; public void afficherjour() { switch (jour) { case LUNDI: System.out.println("Lundi"); break; case MARDI: System.out.println("Mardi"); break; case MERCREDI: System.out.println("Mercredi"); break; case JEUDI: System.out.println("Jeudi"); break; case VENDREDI: System.out.println("Vendredi"); break; case SAMEDI: System.out.println("Samedi"); break; case DIMANCHE: System.out.println("Dimanche"); break; Java - Dr A. Belangour 430 Les énumérations : Exemple public class Main { public static void main(string[] args) { TestEnum testenum = new TestEnum(Jours.VENDREDI); testenum.afficherjour(); Java - Dr A. Belangour 431 2
Les énumérations : valeurs Le premier élément d'une énumération correspond à 0, le deuxième à 1,..etc. Il est possible de changer ses valeurs comme on verra plus tard dans ce cours. La méthode ordinal() permet d'obtenir la valeur associé à chacun de ses éléments. Exemple : Jours j=jours.vendredi; System.out.println(j.ordinal()); Java - Dr A. Belangour 432 Les énumérations : déclaration Les énumérations sont déclarées au même niveau que les classes et les interfaces. Elles peuvent ainsi être déclaré dans un fichier dédié ou suite à une autre classe ou même à l'intérieur d'une classe. Java - Dr A. Belangour 433 3
Les énumérations Lors de la compilation Java, encapsule l'énumération dans une classe héritant de la classe java.lang.enum (il ne peut donc pas hériter d'une autre classe). Cette classe est composée de: Des champs publiques, statiques et finaux du type de l'énumération pour chaque élément Un bloc d'initialisation statique permettant de créer les différentes instances statiques des éléments Java - Dr A. Belangour 434 Les énumérations Une méthode values() renvoyant un tableau des valeurs de l'énumération Une méthode valueof() qui renvoie l'élément de l'énumération dont le nom est fourni en paramètre Remarques : La méthode valueof() prend en paramètre une chaine de caractère représentant le nom de l'identifiant utilisé dans la déclaration de l'énumération. La méthode valueof() ne peut être redéfinie. Java - Dr A. Belangour 435 4
Les énumérations L'exemple de l'énumération précédente deviendra : public final class Jours extends java.lang.enum{ public static final Jours LUNDI; public static final Jours DIMANCHE; static {; public static Jours[] values(); public static Jours valueof(java.lang.string); Java - Dr A. Belangour 436 Les énumérations Remarque : La méthode tostring() est implémentée par défaut dans une énumération. Elle renvoie le nom de la constante. Il est possible de la redéfinir aux besoins. Java - Dr A. Belangour 437 5
Les énumérations En résumé, une énumération peut: implémenter une ou plusieurs interfaces avoir plusieurs constructeurs avoir des attributs et des méthodes avoir des classes internes avoir un bloc d'initialisation statique Java - Dr A. Belangour 438 Les énumérations Il est possible de personnaliser les valeurs associées aux éléments d'une énumération. Dans ce cas, l'énumération doit implicitement définir : un attribut qui contient la valeur associée à l'élément un constructeur qui attend en paramètre la valeur une méthode de type getter pour obtenir la valeur Java - Dr A. Belangour 439 6
Les énumérations Exemple : public enum Coefficient { MONO(1), BI(2), QUADRI(4); private final int valeur; private Coefficient(int valeur) { this.valeur = valeur; public int getvaleur() { return this.valeur; Java - Dr A. Belangour 440 Les énumérations Remarques : Les données manipulées dans un élément d'une énumération doivent être immuables (ne pas changer dans le temps) Les constantes doivent obligatoirement être définis en premier, avant les attributs et les méthodes et ils doivent être terminé par point virgule dans ce cas. Le constructeur d'une classe de type enum ne peut pas être public car il ne doit être invoqué que par la classe elle même pour créer les constantes définies au début de la déclaration de l'énumération. Java - Dr A. Belangour 441 7
Les énumérations : association de valeurs aux éléments Comme une énumération est une classe, il est possible d'associer plusieurs valeurs à un élément de l'énumération. Ces valeurs seront stockées sous la forme d'attributs devant être initialisé par un constructeur. Java - Dr A. Belangour 442 Les énumérations : association de valeurs aux éléments Exemple : import java.math.bigdecimal; public enum Remise { COURANTE(new BigDecimal("0.05"), "Remise de 5%"), FIDELITE(new BigDecimal("0.07"), "Remise de 7%"), EXCEPTIONNELLE(new BigDecimal("0.10"), "Remise de 10%"); private final BigDecimal taux; private final String libelle; Java - Dr A. Belangour 443 8
Les énumérations : association de valeurs aux éléments private Remise(BigDecimal taux, String libelle) { this.taux = taux; this.libelle = libelle; public BigDecimal gettaux() { return this.taux; public String getlibelle() { return this.libelle; Java - Dr A. Belangour 444 Les énumérations : association de valeurs aux éléments public BigDecimal calculer(bigdecimal valeur) { return valeur.multiply(taux).setscale(2, BigDecimal.ROUND_FLOOR); public static void main(string[] args) { BigDecimal montant = new BigDecimal("153.99"); for (Remise remise : Remise.values()) { System.out.println(remise.getLibelle() + " \t" + remise.calculer(montant)); Java - Dr A. Belangour 445 9
Les énumérations : association de valeurs aux éléments Remarques : Dans l'exemple précédent, chaque constante est définie avec les deux paramètres qui la compose : le taux et le libellé. Ces valeurs sont passées au constructeur par le bloc d'initialisation static qui est créé par le compilateur. Un élément d'une énumération ne peut avoir que la valeur avec laquelle elle est définie dans sa déclaration. Ceci justifie que le constructeur ne soit pas public et qu'une énumération ne puisse pas avoir de classes filles. Java - Dr A. Belangour 446 Les énumérations : association de valeurs aux éléments Remarques : Tous les éléments de l'énumération sont encapsulés dans une instance finale du type de l'énumération : ce sont donc des singletons. De plus, les valeurs peuvent être testées avec l'opérateur == puisqu'elles sont déclarées avec le modificateur final. Plusieurs fonctionnalités permettent de s'assurer qu'il n'y aura pas d'autres instances que celles définies par le compilateur à partir du code source : Java - Dr A. Belangour 447 10
Les énumérations : association de valeurs aux éléments il n'y a pas de constructeur public qui permette de l'invoquer pour créer une nouvelle instance il n'est pas possible d'hériter d'une autre classe que la classe Enum il n'est pas possible de créer une classe fille de l'énumération puisqu'elle est déclarée finale l'invocation de la méthode clone() de l'énumération lève une exception de type CloneNotSupportedException Une énumération peut implémenter une ou plusieurs interfaces. Une énumération peut contenir une méthode main(). Java - Dr A. Belangour 448 Les énumérations : personnalisation il est possible de définir chaque élément sous la forme d'une classe interne dans laquelle il est possible de fournir une implémentation particulière pour chaque élément. Il est ainsi possible de définir explicitement pour chaque valeur le corps de la classe qui va l'encapsuler Cette classe est implicitement une extension de la classe englobante. Il est ainsi possible de redéfinir une méthode définie dans l'énumération. Java - Dr A. Belangour 449 11
Les énumérations : personnalisation Exemple : import java.math.bigdecimal; public enum Remise { COURANTE(new BigDecimal("0.05"), "Remise de 5%") { @Override public String tostring() { return "Remise 5%";, Java - Dr A. Belangour 450 Les énumérations : personnalisation FIDELITE(new BigDecimal("0.07"), "Remise de 7%") { @Override public String tostring() { return "Remise fidelite 7%";, Java - Dr A. Belangour 451 12
Les énumérations : personnalisation EXCEPTIONNELLE(new BigDecimal("0.10"), "Remise de 10%") { @Override public String tostring() { return "Remise exceptionnelle 10%"; @Override public String getlibelle() { return "Remise à titre exceptionnelle de 10%"; ; Java - Dr A. Belangour 452 Les énumérations : personnalisation private final BigDecimal taux; private final String libelle; private Remise(BigDecimal taux, String libelle) { this.taux = taux; this.libelle = libelle; public BigDecimal gettaux() { return this.taux; Java - Dr A. Belangour 453 13
Les énumérations : personnalisation public String getlibelle() { return this.libelle; public BigDecimal calculer(bigdecimal valeur) { return valeur.multiply(taux).setscale(2, BigDecimal.ROUND_FLOOR); Java - Dr A. Belangour 454 Les énumérations : personnalisation public static void main(string[] args) { BigDecimal montant = new BigDecimal("153.99"); for (Remise remise : Remise.values()) { System.out.println(remise.getLibelle() + " \t" + remise.calculer(montant)); Java - Dr A. Belangour 455 14
Les énumérations : personnalisation Remarque : Il est aussi possible de définir une méthode abstract dans l'énumération pour forcer la définition de la méthode dans chaque élément. Exemple : La méthode : public abstract String getlibelle(); Se redéfinition dans l'élément exceptionnelle par exemple : @Override public String getlibelle() { return "Remise à titre exceptionnelle de 10%"; Java - Dr A. Belangour 456 Limites des énumérations Les éléments de l'énumération doivent être définis en premier. Un élément d'une énumération ne doit pas être null. Un type Enum ne peut pas hériter d'une autre classe mère (hérite déjà de la classe Enum) Pour garantir qu'il n'y ait qu'une seule instance d'un élément d'une énumération, le constructeur n'est pas accessible et l'énumération ne peut pas avoir de classe fille. Java - Dr A. Belangour 457 15
Limites des énumérations Une énumération ne peut pas être définie localement dans une méthode. La méthode values() renvoie un tableau des éléments de l'énumération dans l'ordre dans lequel ils sont déclarés mais il ne faut surtout pas utiliser l'ordre des éléments d'une énumération dans les traitements : il ne faut par exemple pas tester la valeur retournée par la méthode ordinal() dans les traitements. Des problèmes apparaitront à l'exécution si l'ordre des éléments est modifié car le compilateur ne peut pas détecter ce type de soucis. Java - Dr A. Belangour 458 16