CodeGym /Blog Java /Random-FR /Classe Enum en Java
Auteur
Milan Vucic
Programming Tutor at Codementor.io

Classe Enum en Java

Publié dans le groupe Random-FR
Salut! Dans cet article, nous allons vous parler de Java Enums . Imaginez que l'on vous confie la tâche suivante : créer une classe qui implémente les jours de la semaine . À première vue, cela semble plutôt simple. Votre code ressemblerait à ceci :

public class DayOfWeek {

   private String title;

   public DayOfWeek(String title) {
       this.title = title;
   }

   public static void main(String[] args) {
       DayOfWeek dayOfWeek = new DayOfWeek("Saturday");
       System.out.println(dayOfWeek);
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Tout semble aller bien, mais il y a un problème : vous pouvez passer n'importe quel texte au constructeur de la classe DayOfWeek . Cela signifie que quelqu'un pourrait créer un jour de la semaine nommé "Frog", "Cloud" ou "azaza322". Ce n'est clairement pas le comportement auquel on s'attend, puisqu'il n'y a que 7 jours réels dans la semaine, et chacun d'eux a un nom spécifique. Par conséquent, notre tâche consiste à limiter d'une manière ou d'une autre la plage de valeurs possibles pour la classe DayOfWeek . Avant l'arrivée de Java 1.5, les développeurs devaient inventer indépendamment leurs propres solutions à ce problème, car le langage n'avait pas de solution toute faite. À cette époque, si les programmeurs avaient besoin de limiter le nombre de valeurs, ils le faisaient :

public class DayOfWeek {

   private String title;

   private DayOfWeek(String title) {
       this.title = title;
   }

   public static DayOfWeek SUNDAY = new DayOfWeek("Sunday");
   public static DayOfWeek MONDAY = new DayOfWeek("Monday");
   public static DayOfWeek TUESDAY = new DayOfWeek("Tuesday");
   public static DayOfWeek WEDNESDAY = new DayOfWeek("Wednesday");
   public static DayOfWeek THURSDAY = new DayOfWeek("Thursday");
   public static DayOfWeek FRIDAY = new DayOfWeek("Friday");
   public static DayOfWeek SATURDAY = new DayOfWeek("Saturday");

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Voici ce que vous devriez remarquer :
  • Le constructeur est privé. Si un constructeur est marqué avec le modificateur privé , il ne peut pas être utilisé pour créer un objet. Et comme la classe n'a qu'un seul constructeur, aucun objet DayOfWeek ne peut jamais être créé.

    
    	public class Main {
    
       		public static void main(String[] args) {
          
           			DayOfWeek sunday = new DayOfWeek(); // Error!
       		}
    }
    

  • Bien sûr, la classe possède le nombre requis d' objets statiques publics , qui ont été correctement initialisés (en utilisant les noms corrects des jours de la semaine).

    Cela a permis à ces objets d'être utilisés dans d'autres classes.

    
    	public class Person {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = DayOfWeek.SUNDAY;
    
           			System.out.println(sunday);
      		 }
    }
    

    Sortir:

    DayOfWeek{title = 'dimanche'}

Cette approche résout en grande partie le problème. Nous avons 7 jours de la semaine à notre disposition, et personne ne peut en créer de nouveaux. Cette solution a été proposée par Joshua Bloch dans son livre Effective Java . Soit dit en passant, ce livre est très cool et incontournable pour tout développeur Java. Comment utiliser la classe Enum - 2Avec la sortie de Java 1.5, le langage s'est doté d'une solution toute faite pour de telles situations : Java Enums . Enum en Java est aussi une classe. Il est spécialement "affiné" pour résoudre des problèmes comme celui-ci, c'est-à-dire créer une certaine plage limitée de valeurs. Les créateurs de Java avaient déjà des exemples prêts (par exemple, C avait déjà enum ), ils ont donc pu créer la meilleure variante.

Qu'est-ce que Java Enum ?

Reprenons notre exemple DayOfWeek :

public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Maintenant, cela semble beaucoup plus simple :) En interne, notre Enum a 7 constantes statiques. Et c'est quelque chose que nous pouvons utiliser pour mettre en œuvre un programme. Par exemple, écrivons un programme qui détermine si un élève doit aller à l'école aujourd'hui. Notre étudiant aura un emploi du temps quotidien, représenté par la classe StudentSchedule :

public class StudentSchedule {

   private DayOfWeek dayOfWeek;
   // ... other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
La variable dayOfWeek de l'objet de planification détermine quel jour est aujourd'hui. Et voici notre classe d'étudiants :

public class Student {

   private StudentSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {
      
       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("Hooray, you can sleep more!");
       } else {
           System.out.println("Damn, time for school again :(");
       }
   }
}
Dans la méthode wakeUp() , nous utilisons Java Enum pour déterminer ce que l'étudiant doit faire ensuite. Nous n'avons même pas fourni de détails sur chaque champ dans DayOfWeek , et nous n'en avons pas besoin : il est évident que les jours de la semaine sont censés fonctionner. Si nous l'utilisions dans sa forme actuelle, n'importe quel développeur comprendrait ce qui se passe dans notre code. Un autre exemple de la commodité d' Enum est que ses constantes peuvent être utilisées avec l'instruction switch. Par exemple, écrivons un programme pour un régime strict, dans lequel les plats sont programmés par jour :

public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("Sunday Dinner! You can even enjoy something a little sweet today.");
               break;
           case MONDAY:
               System.out.println("Lunch for Monday: chicken noodle soup!");
               break;
           case TUESDAY:
               System.out.println("Tuesday, today it's celery soup :(");
               break;
               //... and so on to the end
       }
   }
}
C'est l'un des avantages d'Enums par rapport à l'ancienne solution utilisée avant Java 1.5 — l'ancienne solution ne pouvait pas être utilisée avec switch . Que devez-vous savoir d'autre sur Enum ? Enum est une vraie classe avec toutes les possibilités que cela implique. Par exemple, si l'implémentation actuelle des jours de la semaine est inadéquate, vous pouvez ajouter des variables, des constructeurs et des méthodes à DayOfWeek :

public enum DayOfWeek {
  
   SUNDAY ("Sunday"),
   MONDAY ("Monday"),
   TUESDAY ("Tuesday"),
   WEDNESDAY ("Wednesday"),
   THURSDAY ("Thursday"),
   FRIDAY ("Friday"),
   SATURDAY ("Saturday");

   private String title;

   DayOfWeek(String title) {
       this.title = title;
   }

   public String getTitle() {
       return title;
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Maintenant, nos constantes Enum ont un champ de titre , un getter et une méthode toString remplacée . Par rapport aux classes régulières, une limitation sérieuse a été placée sur Enum - elle ne peut pas être héritée. De plus, les énumérations ont des méthodes caractéristiques :
  • values() : renvoie un tableau de toutes les valeurs de l' Enum :

    
    public static void main(String[] args) {
       		System.out.println(Arrays.toString(DayOfWeek.values()));
    }
    

    Sortir:

    [DayOfWeek{title = 'Sunday'}, DayOfWeek{title = 'Monday'}, DayOfWeek{title = 'Tuesday'}, DayOfWeek{title = 'Wednesday'}, DayOfWeek{title = 'Jeudi'}, DayOfWeek{title = 'Vendredi'}, DayOfWeek{title = 'Samedi'}]

  • ordinal() : renvoie le nombre ordinal de la constante. La numérotation commence à zéro :

    
    	public static void main(String[] args) {
    
       		int sundayIndex = DayOfWeek.SUNDAY.ordinal();
       		System.out.println(sundayIndex);
    }
    

    Sortir:

    0

  • valueOf() : retourne l' objet Enum qui correspond au nom passé :

    
    public static void main(String[] args) {
       DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY");
       System.out.println(sunday);
    }
    

    Sortir:

    DayOfWeek{title = 'dimanche'}

Note:nous utilisons des lettres majuscules pour spécifier les champs Enum . Ce sont des constantes, elles utilisent donc tout en majuscule plutôt que camelCase .
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION