JavaRush /Java блогы /Random-KK /Java тіліндегі Enum: сыныпты қалай пайдалануға болады

Java тіліндегі Enum: сыныпты қалай пайдалануға болады

Топта жарияланған
Сәлеметсіз бе! Бұл мақалада мен сізге Java Enums туралы айтып беремін. Сізге тапсырма берілгенін елестетіп көріңіз: апта күндерін жүзеге асыратын сынып жасаңыз . Бір қарағанда, бұл туралы күрделі ештеңе жоқ және сіздің codeыңыз келесідей болады:
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='Жексенбі'}

Бұл тәсіл көп жағдайда мәселені шешуге мүмкіндік берді. Бізде аптаның 7 күні болды және ешкім жаңасын жасай алмады. Бұл шешімді Джошуа Блох ұсынған «Тиімді Java» кітабында . Кітап, айтпақшы, өте керемет және кез келген Java әзірлеушісі үшін оқуы керек.
Enum класын қалай пайдалануға болады - 2
Java 1.5 шығарылымымен тіл осындай жағдайларға дайын шешімді енгізді - Enum enumeration . Enum да класс болып табылады. Бірақ ол бізге ұқсас мәселелерді шешу үшін арнайы «бейімделген»: құндылықтардың белгілі бір шектеулі ауқымын құру. Java жасаушыларында дайын мысалдар (айталық, Enum бұрыннан бар Си тілі) болғандықтан, олар оңтайлы нұсқаны жасай алды.

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='Жексенбі'}

Назар аударыңыз:Enum элементтерінің атауларын бас әріппен жазамыз , себебі олар тұрақты болып табылады және camelCase емес, тұрақтылар ретінде тағайындалады .
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION