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 + '\'' +
'}';
}
}
Ва ба назар чунин мерасад, ки ҳама чиз хуб аст, аммо як мушкилот вуҷуд дорад: шумо метавонед ҳар як матнро ба конструктори синфи DayOfWeek интиқол диҳед. Бо ин роҳ, касе метавонад рӯзи ҳафта "Қурбоққа", "Абр" ё "azaza322" -ро эҷод кунад. Ин бешубҳа рафторе нест, ки мо интизорем, зеро танҳо 7 рӯзи воқеии ҳафта вуҷуд дорад ва ҳар яки онҳо ном доранд. Аз ин рӯ, вазифаи мо аз он иборат аст, ки бо ягон роҳ доираи арзишҳои имконпазирро барои синфи " рӯзи ҳафта " маҳдуд кунем. Пеш аз Java 1.5, таҳиягарон маҷбур буданд, ки мустақилона ҳалли ин мушкилотро пайдо кунанд, зеро дар худи забон ҳалли тайёр вуҷуд надошт. Дар он рӯзҳо, агар вазъият миқдори маҳдуди арзишҳоро талаб мекард, онҳо ин корро карданд:
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 + '\'' +
'}';
}
}
Дар ин ҷо шумо бояд ба чӣ диққат диҳед:
-
Конструктори хусусӣ. Агар созанда бо тағирдиҳандаи хусусӣ қайд карда шуда бошад , an objectи синфро бо истифода аз он созанда сохтан мумкин нест. Ва азбаски дар ин синф танҳо як конструктор мавҷуд аст, an objectи DayOfWeek умуман сохта намешавад.
public class Main { public static void main(String[] args) { DayOfWeek sunday = new DayOfWeek();//error! } }
-
Ҳамзамон, синф миқдори зарурии an objectҳои статикии ҷамъиятиро дар бар мегирад , ки ба тарзе, ки ба мо лозим буд, оғоз карда шуданд (номи рӯзҳо дуруст аст).
Ин имкон дод, ки an objectҳо дар синфҳои дигар истифода шаванд.
public class Man { public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.SUNDAY; System.out.println(sunday); } }
Хулоса:
DayOfWeek{title='Якшанбе'}
enum чист?
Пас, Enum дар Java чист ? Биёед ба мисоли ҳамон DayOfWeek назар андозем :public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
Ин аллакай хеле соддатар ба назар мерасад :) Дар дохor Enum мо 7 доимӣ бо дастрасии статикӣ мавҷуданд. Мо аллакай метавонем онро барои татбиқи мантиқ дар барнома истифода барем. Масалан, биёед барномае нависем, ки муайян кунад, ки талаба имрӯз бояд ба мактаб равад. Донишҷӯи мо реҷаи ҳаррӯзаи худро хоҳад дошт, ки аз ҷониби синфи ScholarSchedule таъин шудааст :
public class ScholarSchedule {
private DayOfWeek dayOfWeek;
//...other fields
public DayOfWeek getDayOfWeek() {
return dayOfWeek;
}
public void setDayOfWeek(DayOfWeek dayOfWeek) {
this.dayOfWeek = dayOfWeek;
}
}
Тағйирёбандаи dayOfWeek дар реҷаи рӯз муайян мекунад, ки он рӯз аст. Ва ин аст синфи донишҷӯи мо:
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() бо истифода аз Enum мо амалҳои минбаъдаи донишҷӯро муайян мекунем. Мо ҳатто ба таври муфассал шарҳ надодаем, ки ҳар як тағирёбанда дар DayOfWeek чӣ маъно дорад ва ин шарт нест: механизми рӯзҳои ҳафта аллакай аён аст ва агар мо онро дар шакли ҳозираи худ истифода барем, ҳар як таҳиякунанда дарк хоҳад кард дар codeи шумо рӯй медиҳад. Мисоли дигари роҳати Enum ин аст, ки константаҳои он метавонанд бо баёнияи switch истифода шаванд . Масалан, мо барои парҳези қатъӣ як барнома менависем, ки дар он хӯрок ба рӯз ба нақша гирифта шудааст:
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
}
}
}
Ин яке аз бартариҳои Enum нисбат ба ҳалли кӯҳнаест, ки пеш аз Java 1.5 истифода мешуд: ҳалли кӯҳнаро бо switch истифода бурдан мумкин нест .
Дар бораи синфи Enum боз чиро донистан лозим аст?
Синфи Enum як синфи воқеӣ бо тамоми қобorятҳое мебошад, ки бо он меояд. Масалан, агар татбиқи ҷории рӯзҳои ҳафта барои шумо кофӣ набошад, шумо метавонед тағирёбандаҳо, конструкторҳо ва усулҳоро ба 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 + '\'' +
'}';
}
}
Константаҳои Enum-и мо ҳоло майдони унвонӣ , гетер ва усули бекоркардаи toString доранд . Дар муқоиса бо синфҳои муқаррарӣ, Enum як маҳдудияти ҷиддӣ дорад - онро мерос гирифтан мумкин нест. Илова бар ин, рӯйхатҳо усулҳои хоси худро доранд:
-
values() : массиви ҳамаи арзишҳои дар Enum захирашударо бармегардонад :
public static void main(String[] args) { System.out.println(Arrays.toString(DayOfWeek.values())); }
Хулоса:
[DayOfWeek{title='Sunday'}, DayOfWeek{title='Monday'}, DayOfWeek{title='Tuesday'}, DayOfWeek{title='Wednesday'}, DayOfWeek{title='Thursday'}, DayOfWeek{title= 'Ҷумъа'}, DayOfWeek{title='Saturday'}]
-
ordinal() : адади тартибии доимиро бармегардонад. Ҳисоб аз сифр оғоз мешавад:
public static void main(String[] args) { int sundayIndex = DayOfWeek.SUNDAY.ordinal(); System.out.println(sundayIndex); }
Хулоса:
0
- valueOf() : an objectи Enum- ро , ки ба номи додашуда мувофиқ аст, бармегардонад:
public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY"); System.out.println(sunday); }
Хулоса:
DayOfWeek{title='Якшанбе'}
GO TO FULL VERSION