1. Contexte de enumla création

Aujourd'hui, nous allons explorer un autre type de type de données en Java : enum. Le nom enumvient du mot énumération . Quel est ce type de données et à quoi sert-il ?

Parfois, un programmeur doit créer un nouveau type de données, dont les valeurs possibles sont limitées à une petite liste fixe.

Par exemple, un DayOfTheWeektype ne peut prendre que les valeurs MONDAY, TUESDAY, WEDNESDAY, ... Il y a 7 valeurs au total. Soit un Monthtype ne peut prendre que les valeurs JANUARY, FEBRUARY, MARCH, ... Il y a 12 valeurs au total.

Bien sûr, vous pouvez utiliser des nombres (le inttype) : 1— lundi, 2— mardi, etc. Mais quelqu'un pourrait accidentellement affecter des valeurs non valides telles que 8ou 0à votre variable.

Vous pourriez facilement avoir une situation où un programmeur pense que les jours de la semaine (ou les mois de l'année) sont numérotés à partir de zéro, tandis que d'autres s'attendent à ce que leur numérotation commence à partir de un, etc.

C'est pourquoi Java a introduit enum, un type de données constitué d' un ensemble fini de valeurs .


2. Déclarer un type

La déclaration d'un nouveau enumtype de données ressemble à ceci :

enum TypeName
{
   VALUE1,
   VALUE2,
   VALUE3
}

TypeNameest le nom du nouveau type (classe), et les valeurs possibles sont séparées par des virgules et entourées d'accolades : Value1, Value2, Value3.

A titre d'exemple, créons le nôtre DayOfTheWeek enum:

Code Note
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
Nouveau Daytype

Lundi
Mardi
Mercredi
Jeudi
Vendredi
Samedi
Dimanche

Voici comment vous affectez une valeur à une variable de notre nouveau type :

Day day = Day.MONDAY;

Exemple:

Code Note
Day day = Day.FRIDAY;
System.out.println(day);
La sortie d'écran sera :
FRIDAY


3. Méthodes d'unenum

Un enumtype a plusieurs méthodes intégrées, dont deux sont très intéressantes :

La méthode statique values()renvoie un tableau de toutes les valeurs du enumtype :

Code Note
Day[] days = Day.values();

for (Day day: days)
   System.out.println(day);







System.out.println(days[2]);
La daysvariable stocke un tableau contenant les valeurs de Daytype (7 éléments)

Afficher le contenu du tableau à l'écran :
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

La ordinal()méthode renvoie le nombre ordinal de la constante. Vous l'appelez sur une enumvaleur plutôt que sur une enumclasse :

Code Sortie console
System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.FRIDAY.ordinal());
System.out.println(Day.SUNDAY.ordinal());
0
4
6


4. Conversion en classe

En réalité, il n'y a rien de magique ici. Le compilateur vient de nous donner du sucre syntaxique. Au moment de la compilation, l' Dayénumération est convertie en une classe ordinaire :

Code, version simplifiée Note
public class Day
{
   public static final Day MONDAY = new Day(0);
   public static final Day TUESDAY = new Day(1);
   public static final Day WEDNESDAY = new Day(2);
   public static final Day THURSDAY = new Day(3);
   public static final Day FRIDAY = new Day(4);
   public static final Day SATURDAY = new Day(5);
   public static final Day SUNDAY = new Day(6);

    private static final Day[] array = {MONDAY, TUESDAY,
      WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};

   private final int value;

   private Day (int value)
   {
      this.value = value;
   }

   public int ordinal()
   {
      return this.value;
   }

   public static Day[] values()
   {
      return array;
   }
}
Dayclass

Liste de constantes statiques







Un tableau avec toutes les valeurs de l' Dayénumération


Une variable qui stocke la valeur d'un Dayobjet spécifique

La Dayclasse constructorest privée, ce qui signifie que les objets de la Dayclasse ne peuvent être créés qu'à l'intérieur de la Dayclasse.



La ordinalméthode doit être appelée sur un Dayobjet.

Il renvoie la valeur de l'objet — le valuechamp.


La méthode retourne un tableau statique avec toutes les valeurs de la Dayclasse

Si nous supprimons toutes les méthodes et variables statiques de la Dayclasse, nous obtenons ce qui suit :

Code Note
public class Day
{
  private int value;

  private Day (int value)
  {
    this.value = value;
  }

  public int ordinal()
  {
    return this.value;
  }
}


La valuevariable stocke la valeur de l' Dayobjet

DayLes objets ne peuvent être créés qu'à l'intérieur de la Dayclasse, puisque le constructeur est private.




La ordinal()méthode renvoie le valuede l' Dayobjet.

En d'autres termes, rien d'effrayant ne se passe ici. Le compilateur crée la Dayclasse, ajoute les constantes qui représentent les enumvaleurs, ajoute les méthodes nécessaires et crée la classe constructor private. Nous verrons comment fonctionnent les constructeurs un peu plus tard.

Espérons que la raison pour laquelle nous attribuons une valeur à une variable de cette manière est désormais claire :

Day day = Day.MONDAY;

MONDAYest juste un champ statique (constant) dans la Dayclasse. Lorsque vous accédez à des méthodes et des champs statiques depuis l'extérieur de la classe, vous devez indiquer le nom de la classe avant le nom du champ ou de la méthode.



5. Plus de méthodes d'unenum

Chaque enumclasse a plusieurs caractéristiques intéressantes.

Conversion vers et depuis une chaîne

Pour convertir un objet enum en chaîne, vous devez appeler sa toString()méthode.

String str = Day.MONDAY.toString();

Pour convertir dans l'autre sens (d'une chaîne vers un Dayobjet), vous pouvez utiliser la valueOf()méthode statique :

Day day = Day.valueOf("MONDAY");

C'est super pratique et sera utile dans de nombreux cas.

Conversion en nombre et retour

Vous savez déjà convertir un enumobjet en nombre : appelez la ordinal()méthode :

int index = Day.MONDAY.ordinal();

Pour convertir dans l'autre sens (d'un nombre à un Dayobjet), vous avez besoin d'une construction plus transparente :

Day day = Day.values()[2];

Exemples:

Code Note
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
Lundi
Obtenir l'index du lundi : 0
Jour de la semaine 2 jours après lundi

Point important : étant donné que enumles valeurs sont un ensemble fixe de constantes, elles peuvent être comparées à l'aide de == . En d'autres termes, vous ne pouvez pas avoir deux MONDAYobjets identiques avec des adresses différentes. Une seule instance de chaque valeur d'énumération existe. Et cela signifie que la comparaison des variables enum en utilisant == fonctionnera toujours.



6. Ajouter vos propres méthodes à unenum

Comme an enumdevient une classe ordinaire au moment de la compilation, vous pouvez y déclarer des méthodes. Ces méthodes sont simplement ajoutées à la classe générée par le compilateur. Par exemple, supposons que nous souhaitions que notre Day enumrenvoie une liste des valeurs enum plutôt qu'un tableau.

Ensuite, nous pouvons ajouter le code suivant :

Code Note
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY;

   public static List<Day> asList()
   {
      ArrayList<Day> list = new ArrayList<Day>();

      Collections.addAll(list, values());

      return list;
   }

}








Un point-virgule est requis après la liste de valeurs.



Créer un ArrayListobjet

Ajouter les valeurs dans le tableau renvoyé par la values()méthode.
Renvoyez la liste.

Maintenant, cette méthode peut être appelée dans le code :

Code Note
List<Day> list = Day.asList();
La listvariable stockera une liste de toutes les valeurs de Day enum.