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
}
Où 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 |
|---|---|
|
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 |
|---|---|
|
La sortie d'écran sera : |
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 |
|---|---|
|
La daysvariable stocke un tableau contenant les valeurs de Daytype (7 éléments) Afficher le contenu du tableau à l'écran : |
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 |
|---|---|
|
|
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 |
|---|---|
|
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 |
|---|---|
|
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 |
|---|---|
|
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 |
|---|---|
|
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 |
|---|---|
|
La listvariable stockera une liste de toutes les valeurs de Day enum. |
GO TO FULL VERSION