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ісін сол конструктор арқылы жасау мүмкін емес. Бұл сыныпта бір ғана конструктор болғандықтан, DayOfWeek нысанын мүлде жасау мүмкін емес.
public class Main { public static void main(String[] args) { DayOfWeek sunday = new DayOfWeek();//error! } }
-
Сонымен қатар, сыныпта бізге қажетті жолмен инициализацияланған жалпыға ортақ статикалық нысандардың қажетті саны болды (күндердің атаулары дұрыс).
Бұл an objectілерді басқа сыныптарда пайдалануға мүмкіндік берді.
public class Man { public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.SUNDAY; System.out.println(sunday); } }
Қорытынды:
DayOfWeek{title='Жексенбі'}
enum дегеніміз не?
Сонымен, Java-дағы Enum дегеніміз не ? Сол DayOfWeek мысалын қарастырайық :public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
Бұл әлдеқайда қарапайым көрінеді :) Біздің 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
}
}
}
Бұл Java 1.5 нұсқасына дейін қолданылған ескі шешімге қарағанда Enum артықшылықтарының бірі : ескі шешімді switch арқылы пайдалану мүмкін емес .
Enum сыныбы туралы тағы не білу керек?
Enum класы - онымен бірге келетін барлық мүмкіндіктері бар нақты сынып. Мысалы, апта күндерінің ағымдағы орындалуы сізге жеткіліксіз болса, 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= 'Friday'}, DayOfWeek{title='Saturday'}]
-
ordinal() : тұрақтының реттік санын қайтарады. Кері санақ нөлден басталады:
public static void main(String[] args) { int sundayIndex = DayOfWeek.SUNDAY.ordinal(); System.out.println(sundayIndex); }
Қорытынды:
0
- valueOf() :Берілген атқа сәйкес Enum нысанын қайтарады:
public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY"); System.out.println(sunday); }
Қорытынды:
DayOfWeek{title='Жексенбі'}
GO TO FULL VERSION