JavaRush /Blog Java /Random-FR /Enum en Java : comment utiliser la classe

Enum en Java : comment utiliser la classe

Publié dans le groupe Random-FR
Bonjour! Dans cet article, je vais vous parler des énumérations Java. Imaginez qu'on vous confie une tâche : créer une classe qui implémente les jours de la semaine . À première vue, cela n’a rien de compliqué, et votre code ressemblera à 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 + '\'' +
               '}';
   }
}
Et tout semble aller bien, mais il y a un problème : vous pouvez transmettre n'importe quel texte au constructeur de la classe DayOfWeek . De cette façon, quelqu'un peut créer le jour de la semaine "Frog", "Cloud" ou "azaza322". Ce n'est clairement pas le comportement auquel on s'attend, car il n'y a que 7 jours réels dans la semaine, et chacun d'eux a un nom. Par conséquent, notre tâche est de limiter d'une manière ou d'une autre la plage de valeurs possibles pour la classe « jour de la semaine ». Avant Java 1.5, les développeurs étaient obligés de trouver eux-mêmes une solution à ce problème, car il n'existait pas de solution toute faite dans le langage lui-même. À cette époque, si la situation exigeait un nombre limité de valeurs, ils faisaient ceci :
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 + '\'' +
               '}';
   }
}
Ce à quoi vous devez faire attention ici :
  • Constructeur privé. Si un constructeur est marqué avec le modificateur private , un objet de la classe ne peut pas être créé à l'aide de ce constructeur. Et comme il n'y a qu'un seul constructeur dans cette classe, l' objet DayOfWeek ne peut pas être créé du tout.

    public class Main {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = new DayOfWeek();//error!
       		}
    }
  • Dans le même temps, la classe contenait le nombre requis d' objets statiques publics , initialisés comme nous en avions besoin (les noms des jours sont corrects).

    Cela a permis d'utiliser des objets dans d'autres classes.

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

    Conclusion:

    JourDeLaSemaine{title='Dimanche'}

Cette approche nous a largement permis de résoudre le problème. Nous disposions de 7 jours de la semaine et personne ne pouvait en créer de nouveaux. Cette solution a été proposée par Joshua Bloch dans le livre Effective Java . Soit dit en passant, le livre est très cool et incontournable pour tout développeur Java.
Comment utiliser la classe Enum - 2
Avec la sortie de Java 1.5, le langage a introduit une solution toute faite pour de telles situations : l' énumération Enum . Enum est aussi une classe. Mais il est spécialement « adapté » pour résoudre des problèmes similaires au nôtre : la création d’une certaine gamme limitée de valeurs. Étant donné que les créateurs de Java disposaient déjà d'exemples prêts à l'emploi (par exemple, le langage C, dans lequel Enum existait déjà), ils ont pu créer l'option optimale.

Qu'est-ce qu'une énumération ?

Alors, qu’est-ce qu’Enum en Java ? Regardons l'exemple du même DayOfWeek :
public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Cela semble déjà beaucoup plus simple :) Dans notre Enum , il y a 7 constantes avec accès statique. Nous pouvons déjà l'utiliser pour implémenter la logique dans le programme. Par exemple, écrivons un programme qui déterminera si un élève doit aller à l'école aujourd'hui. Notre élève aura sa propre routine quotidienne, désignée par la classe ScholarSchedule :
public class ScholarSchedule {

   private DayOfWeek dayOfWeek;
   //...other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
La variable dayOfWeek en mode jour détermine le jour. Et voici la classe de notre élève :
public class Scholar {

   private ScholarSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {

       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("Hooray, you can sleep some more!");
       } else {
           System.out.println("Damn, back to school :(");
       }
   }
}
Dans la méthode wakeUp() , en utilisant Enum, nous déterminons les actions ultérieures de l'étudiant. Nous n'avons même pas décrit en détail ce que signifie chaque variable de DayOfWeek , et ce n'est pas nécessaire : le mécanisme des jours de la semaine est déjà évident, et si nous l'utilisons sous sa forme actuelle, tout développeur comprendra quoi se passe dans votre code. Un autre exemple de la commodité d'Enum est que ses constantes peuvent être utilisées avec une instruction switch . Par exemple, nous écrivons un programme de régime strict, dans lequel les repas sont programmés par jour :
public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("Sunday lunch! Today you can even have a little sweet");
               break;
           case MONDAY:
               System.out.println("Monday Lunch: Chicken Noodles!");
               break;
           case TUESDAY:
               System.out.println("Tuesday, today is celery soup :(");
               break;
               //...and so on until the end
       }
   }
}
C'est l'un des avantages d'Enum 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 la classe Enum ?

La classe Enum est une véritable classe avec toutes les capacités qui l'accompagnent. Par exemple, si l'implémentation actuelle des jours de la semaine ne vous suffit pas, 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 + '\'' +
               '}';
   }
}
Les constantes de notre Enum ont désormais un champ de titre , un getter et une méthode toString remplacée . Par rapport aux classes ordinaires, Enum a une sérieuse limitation : on ne peut pas en hériter. De plus, les énumérations ont des méthodes qui leur sont propres :
  • values() : renvoie un tableau de toutes les valeurs stockées dans Enum :

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

    Conclusion:

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

  • ordinal() : renvoie le numéro ordinal d'une constante. Le compte à rebours repart de zéro :

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

    Conclusion:

    0

  • valueOf() : Renvoie un objet Enum correspondant au nom donné :

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

    Conclusion:

    JourDeLaSemaine{title='Dimanche'}

Faites attention:Nous mettons en majuscule les noms des éléments Enum car ce sont des constantes et sont désignés comme constantes, et non comme camelCase .
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION