1. Contexte de enum
la création
Aujourd'hui, nous allons explorer un autre type de type de données en Java : enum
. Le nom enum
vient 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 DayOfTheWeek
type ne peut prendre que les valeurs MONDAY
, TUESDAY
, WEDNESDAY
, ... Il y a 7 valeurs au total. Soit un Month
type 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 int
type) : 1
— lundi, 2
— mardi, etc. Mais quelqu'un pourrait accidentellement affecter des valeurs non valides telles que 8
ou 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 enum
type de données ressemble à ceci :
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Où TypeName
est 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 Day type 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 enum
type 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 enum
type :
Code | Note |
---|---|
|
La days variable stocke un tableau contenant les valeurs de Day type (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 enum
valeur plutôt que sur une enum
classe :
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 |
---|---|
|
Day class Liste de constantes statiques Un tableau avec toutes les valeurs de l' Day énumération Une variable qui stocke la valeur d'un Day objet spécifique La Day classe constructor est privée, ce qui signifie que les objets de la Day classe ne peuvent être créés qu'à l'intérieur de la Day classe. La ordinal méthode doit être appelée sur un Day objet. Il renvoie la valeur de l'objet — le value champ. La méthode retourne un tableau statique avec toutes les valeurs de la Day classe |
Si nous supprimons toutes les méthodes et variables statiques de la Day
classe, nous obtenons ce qui suit :
Code | Note |
---|---|
|
La value variable stocke la valeur de l' Day objet Day Les objets ne peuvent être créés qu'à l'intérieur de la Day classe, puisque le constructeur est private . La ordinal() méthode renvoie le value de l' Day objet. |
En d'autres termes, rien d'effrayant ne se passe ici. Le compilateur crée la Day
classe, ajoute les constantes qui représentent les enum
valeurs, 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;
MONDAY
est juste un champ statique (constant) dans la Day
classe. 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 enum
classe 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 Day
objet), 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 enum
objet en nombre : appelez la ordinal()
méthode :
int index = Day.MONDAY.ordinal();
Pour convertir dans l'autre sens (d'un nombre à un Day
objet), 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 enum
les 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 MONDAY
objets 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 enum
devient 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 enum
renvoie 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 ArrayList objet 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 list variable stockera une liste de toutes les valeurs de Day enum . |