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'}

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 . -
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'}
Plus de lecture : |
---|
GO TO FULL VERSION