JavaRush /Блоги Java /Random-TG /Enum дар Java: Чӣ тавр истифода бурдани синф

Enum дар Java: Чӣ тавр истифода бурдани синф

Дар гурӯҳ нашр шудааст
Салом! Дар ин мақола ман ба шумо дар бораи Java Enums нақл мекунам. Тасаввур кунед, ки ба шумо супориш дода шудааст: синфе созед, ки рӯзҳои ҳафтаро амалӣ мекунад . Дар назари аввал, дар ин бора ҳеҷ чизи мураккаб нест ва рамзи шумо чунин хоҳад буд:
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='Якшанбе'}

Чунин муносибат ба мо имкон дод, ки проблемаро хал кунем. Мо 7 рӯзи ҳафта дар ихтиёри худ будем ва ҳеҷ кас натавонист рӯзҳои навро эҷод кунад. Ин ҳалли онро Ҷошуа Блок дар китоби Effective Java пешниҳод кардааст . Дар омади гап, китоб хеле аҷиб аст ва барои ҳар як таҳиягари Java ҳатмист.
Чӣ тавр истифода бурдани синфи Enum - 2
Бо нашри Java 1.5, забон як ҳалли омода барои чунин ҳолатҳо - Enum enumeration -ро ҷорӣ кард . Enum низ як синф аст. Аммо он барои халли масъалахое, ки ба мо монанд аст, махсус «мутобик» карда шудааст: ба вучуд овардани доираи муайяни махдуди арзишхо. Азбаски созандагони Java аллакай намунаҳои тайёр доштанд (бигӯед, забони Си, ки дар он Enum аллакай мавҷуд буд), онҳо тавонистанд варианти оптималиро эҷод кунанд.

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='Якшанбе'}

Диққат диҳед:Мо номҳои унсурҳои Enumро бо ҳарфҳои калон ҳарф мезанем , зеро онҳо доимӣ мебошанд ва ҳамчун доимӣ таъин шудаанд, на camelCase .
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION