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 + '\'' +
'}';
}
}
Və hər şey yaxşı görünür, amma bir problem var: DayOfWeek sinfinin konstruktoruna istənilən mətni ötürə bilərsiniz . Bu yolla kimsə həftənin gününü "Qurbağa", "Bulud" və ya "azaza322" yarada bilər. Bu, açıq şəkildə gözlədiyimiz davranış deyil, çünki həftənin yalnız 7 real günü var və hər birinin bir adı var. Buna görə də, vəzifəmiz " həftənin günü " sinfi üçün mümkün dəyərlərin diapazonunu bir şəkildə məhdudlaşdırmaqdır. Java 1.5-dən əvvəl tərtibatçılar bu problemin öz həllini tapmağa məcbur idilər, çünki dilin özündə hazır həll yolu yox idi. O günlərdə vəziyyət məhdud sayda dəyər tələb edirdisə, bunu etdilər:
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 + '\'' +
'}';
}
}
Burada nələrə diqqət etməlisiniz:
-
Şəxsi konstruktor. Əgər konstruktor özəl dəyişdirici ilə işarələnibsə , həmin konstruktordan istifadə etməklə sinif obyekti yaradıla bilməz. Və bu sinifdə yalnız bir konstruktor olduğundan DayOfWeek obyekti ümumiyyətlə yaradıla bilməz.
public class Main { public static void main(String[] args) { DayOfWeek sunday = new DayOfWeek();//error! } }
-
Eyni zamanda, sinif bizə lazım olan şəkildə işə salınan tələb olunan sayda ictimai statik obyektləri ehtiva edir (günlərin adları düzgündür).
Bu, başqa siniflərdə obyektlərdən istifadə etməyə imkan verdi.
public class Man { public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.SUNDAY; System.out.println(sunday); } }
Nəticə:
DayOfWeek{title='Bazar'}
enum nədir?
Beləliklə, Java-da Enum nədir ? Eyni DayOfWeek nümunəsinə baxaq :public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
Artıq çox sadə görünür :) Bizim Enum daxilində statik çıxışı olan 7 sabit var. Proqramda məntiqi həyata keçirmək üçün artıq ondan istifadə edə bilərik. Məsələn, şagirdin bu gün məktəbə getməli olub-olmadığını müəyyən edəcək bir proqram yazaq. Tələbəmizin ScholarSchedule sinfi tərəfindən təyin olunmuş öz gündəlik rejimi olacaq :
public class ScholarSchedule {
private DayOfWeek dayOfWeek;
//...other fields
public DayOfWeek getDayOfWeek() {
return dayOfWeek;
}
public void setDayOfWeek(DayOfWeek dayOfWeek) {
this.dayOfWeek = dayOfWeek;
}
}
Gün rejimində dayOfWeek dəyişəni günün hansı gün olduğunu müəyyən edir. Budur tələbəmizin sinfi:
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 :(");
}
}
}
wakeUp() metodunda Enum istifadə edərək tələbənin sonrakı hərəkətlərini müəyyənləşdiririk. DayOfWeek -dəki hər dəyişənin nə demək olduğunu belə ətraflı təsvir etmədik və bu lazım deyil: həftənin günlərinin mexanizmi artıq aydındır və onu indiki formada istifadə etsək, hər hansı bir tərtibatçı nə başa düşəcək kodunuzda baş verir. Enumun rahatlığına başqa bir misal ondan ibarətdir ki, onun sabitləri switch ifadəsi ilə istifadə oluna bilər . Məsələn, yeməklərin gün ərzində təyin olunduğu ciddi bir pəhriz proqramı yazırıq:
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
}
}
}
Bu Java 1.5-dən əvvəl istifadə edilən köhnə həll üzərində Enumun üstünlüklərindən biridir : köhnə həll keçid ilə istifadə edilə bilməzdi .
Enum sinfi haqqında başqa nə bilmək lazımdır?
Enum sinfi onunla birlikdə gələn bütün imkanlara malik real sinifdir. Məsələn, həftənin günlərinin cari tətbiqi sizin üçün kifayət deyilsə, DayOfWeek- ə dəyişənlər, konstruktorlar və metodlar əlavə edə bilərsiniz: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 + '\'' +
'}';
}
}
Bizim Enum sabitləri indi başlıq sahəsinə , alıcıya və ləğv edilmiş toString metoduna malikdir . Adi siniflərlə müqayisədə, Enumun bir ciddi məhdudiyyəti var - onu miras almaq olmaz. Bundan əlavə, siyahıların özünəməxsus üsulları var:
-
values() : Enum- da saxlanan bütün dəyərlərin massivini qaytarır:
public static void main(String[] args) { System.out.println(Arrays.toString(DayOfWeek.values())); }
Nəticə:
[DayOfWeek{title='Sunday'}, DayOfWeek{title='Monday'}, DayOfWeek{title='Tuesday'}, DayOfWeek{title='Wednesday'}, DayOfWeek{title='Cümə axşamı'}, DayOfWeek{title= 'Cümə'}, DayOfWeek{title='Şənbə'}]
-
ordinal() : sabitin sıra nömrəsini qaytarır. Geri sayma sıfırdan başlayır:
public static void main(String[] args) { int sundayIndex = DayOfWeek.SUNDAY.ordinal(); System.out.println(sundayIndex); }
Nəticə:
0
- valueOf() :Verilmiş ada uyğun olan Enum obyektini qaytarır:
public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY"); System.out.println(sunday); }
Nəticə:
DayOfWeek{title='Bazar'}
GO TO FULL VERSION