JavaRush /Java блогу /Random-KY /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 an objectисин таптакыр түзүүгө болбойт.

    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 . енум хем клас болуп дуряр. Бирок ал атайын биздикине окшош маселелерди чечүү үчүн "ыңгайлаштырылган": баалуулуктардын белгилүү бир чектелген диапазонун түзүү. Java түзүүчүлөрү буга чейин эле даяр мисалдарга ээ болгондуктан (айталы, Enum мурунтан эле бар болгон Си тor) алар оптималдуу вариантты түзө алышкан.

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 менен колдонуу мүмкүн эмес .

Енум класы хакында ене нэме билмели?

Энум класы онун билен гелен эхли мумкинч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= 'Friday'}, DayOfWeek{title='Saturday'}]

  • ordinal() : туруктуулуктун иреттик санын кайтарат. Артка санак нөлдөн башталат:

    public static void main(String[] args) {
    
       		int sundayIndex = DayOfWeek.SUNDAY.ordinal();
       		System.out.println(sundayIndex);
    }

    Жыйынтык:

    0

  • valueOf() :Берилген атка туура келген Enum an objectин кайтарат:

    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