JavaRush /Блоги Java /Random-TG /Enum дар Java. Намунаҳои амалӣ. Илова кардани конструктор...

Enum дар Java. Намунаҳои амалӣ. Илова кардани конструкторҳо ва усулҳо

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо дар бораи як намуди махсуси додаҳо дар Java сӯҳбат хоҳем кард - Enum(кӯтоҳ барои номбаркунӣ). Хусусияти онҳо чист? Тасаввур кунем, ки мо бояд дар программа моххо амалй шавем. Enum.  Намунаҳои амалӣ.  Илова кардани конструкторҳо ва усулҳо - 1Чунин ба назар мерасад, ки мушкил дар чист? Шумо танҳо бояд муайян кунед, ки ҳар моҳ кадом хусусиятҳо дорад. Шояд ба мо, пеш аз ҳама, номи моҳ ва шумораи рӯзҳо дар он лозим аст. Ҳалли мушкилот хеле оддӣ ба назар мерасад:
public class Month {

   private String name;
   private int daysCount;

   public Month(String name, int daysCount) {
       this.name = name;
       this.daysCount = daysCount;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public int getDaysCount() {
       return daysCount;
   }

   public void setDaysCount(int daysCount) {
       this.daysCount = daysCount;
   }

   @Override
   public String toString() {
       return "Month{" +
               "name='" + name + '\'' +
               ", daysCount=" + daysCount +
               '}';
   }
}
Лутфан маҷмӯи пурра! Мо синфи Month, майдонхои зарурй, гетер-сетхо, toString(). Агар equals()ба шумо hashCode()лозим нест, ки онро барои хушбахтии комил илова кунед :) Аммо, мо як мушкилоти консептуалӣ дорем. Тавре ки шумо дар хотир доред, яке аз бартариҳои асосии OOP дар он аст, ки он моделсозии an objectҳои воқеиро осон мекунад. Курсӣ, мошин, сайёра - ҳамаи ин мафҳумҳои ҳаёти ҳаррӯзаро дар барнома бо истифода аз абстраксия муаррифӣ кардан осон аст. Масъала дар он аст, ки баъзе an objectҳо дар ҷаҳони воқеӣ доираи маҳдуди маъно доранд. Дар як сол ҳамагӣ 4 фасл вуҷуд дорад. Дар мусиқӣ ҳамагӣ 7 нота мавҷуд аст. Дар тақвим ҳамагӣ 12 моҳ мавҷуд аст. Ocean танҳо 11 дӯст дорад (ҳарчанд ин баҳснок аст :)) Ба ибораи дигар, синфи муқаррарии Java наметавонад ин an objectҳоро модел кунад ва маҳдудиятҳои табиии онҳоро эҳтиром кунад. Синфи мо Monthтамоми майдонхои заруриро дорад. Аммо агар барномасози дигар онро истифода барад, ҳеҷ кас ӯро аз сохтани an objectҳои комилан девона манъ намекунад:
public class Main {

   Month month1 = new Month("lolkek", 322);
   Month month2 = new Month("yahoooooooooooo", 12345);

}
Агар ин дар барнома пайдо шавад, пайдо кардани гунаҳкор осон нест! Аз як тараф, барномасозе, ки an objectҳоро офаридааст, метавонист фаҳмид, ки синф Monthмаънои "моҳи сол" -ро дорад ва ин гуна сафсатаҳоро наменависад. Аз тарафи дигар, вай факат аз имкониятхое, ки конструктори синф ба у мухайё кардааст, истифода мебурд. Оё ман метавонам ягон ном ва шумораи рӯзҳоро таъин кунам? Ӯ таъин кард. Дар чунин вазъият чй бояд кард? Пеш аз нашри versionи забони Java 1.5, барномасозон маҷбур буданд, ки, ошкоро, аз он берун шаванд :) Дар он рӯзҳо, онҳо конструксияҳои зеринро эҷод мекарданд:
public class Month {

   private String name;
   private int daysCount;

   private Month(String name, int daysCount) {
       this.name = name;
       this.daysCount = daysCount;
   }

   public static Month JANUARY = new Month("Январь", 31);
   public static Month FEBRUARY = new Month("Февраль", 28);
   public static Month MARCH = new Month("Март", 31);

   @Override
   public String toString() {
       return "Month{" +
               "name='" + name + '\'' +
               ", daysCount=" + daysCount +
               '}';
   }
}
Дар ин ҷо мо шумораи моҳҳоро ба ҷои дувоздаҳ ба се содда кардем, то мисол кӯтоҳтар бошад. Чунин тарҳҳо имкон доданд, ки мушкилот ҳал карда шаванд. Имкониятҳои an objectҳои сохташуда аз ҷониби конструктори хусусӣ маҳдуд карда шуданд:
private Month(String name, int daysCount) {
       this.name = name;
       this.daysCount = daysCount;
   }
Барномасозоне, ки синфро истифода мебаранд, наметавонанд танҳо эҷод кунанд Month. Онҳо маҷбур шуданд, ки an objectҳои ниҳоии статикиро, ки аз ҷониби таҳиягари синф пешниҳод шудаанд, истифода баранд. Чунин менамуд:
public class Main {

   public static void main(String[] args) {

       Month january = Month.JANUARY;
       System.out.println(january);
   }

}
Аммо, таҳиягарони Java мушкилоти мавҷударо мушоҳида карданд. Албатта, олиҷаноб аст, ки барномасозон тавонистанд бо истифода аз абзорҳои дар забон мавҷудбуда ҳалли худро пайдо кунанд, аммо ин он қадар содда ба назар намерасад! Як ҳалли возеҳ лозим буд, ки ҳатто барои шурӯъкунандагон дастрас буд. Ин аст .Дар Java пайдо шуд Enum. Аслан, Enumон синфи Java мебошад, ки маҷмӯи маҳдуди an objectҳои арзишро таъмин мекунад. Ин аст он чӣ гуна аст:
public enum Month {

   JANUARY,
   FEBRUARY,
   MARCH
}
Дар таъриф мо нишон додем, ки Enumин синфи Java аст, аммо оё ин дар ҳақиқат ҳамин тавр аст? Бале, ва мо ҳатто метавонем онро тафтиш кунем. Масалан, кӯшиш кунед, ки мероси моро enum Monthаз ягон синфи дигар мерос гиред:
public abstract class AbstractMonth {
}

//ошибка! No extends clause allowed to enum
public enum Month extends AbstractMonth {

   JANUARY,
   FEBRUARY,
   MARCH
}
Чаро ин рӯй медиҳад? Вақте ки мо ба барнома менависем:
public enum Month
Компилятор ин фармонро ба чунин code табдил медиҳад:
public Class Month extends Enum
Тавре ки шумо аллакай медонед, дар Java мероси сершумор иҷозат дода намешавад. Аз ин рӯ, AbstractMonthмо аз мерос гирифта натавонистем. Ин тарҳи навро чӣ гуна Enumистифода бурдан мумкин аст? Ва он аз тарҳи кӯҳна бо static finalмайдонҳо чӣ фарқ дорад? Хуб, масалан, тарҳи кӯҳна ба мо имкон намедод, ки маҷмӯи арзишҳои шахсии худро дар switchифодаҳо истифода барем. Тасаввур кунед, ки мо мехоҳем як барномае созем, ки ба мо хотиррасон кунад, ки ин моҳ кадом идҳоро таҷлил мекунанд:
public class HolidayReminder {

   public void printHolidays(Month month) {

       switch (month) {

           //error!
           case JANUARY:
       }
   }
}
Дар ин ҷо, чунон ки шумо мебинед, компилятор хато мекунад. Аммо пас аз пайдоиши Java 1.5 enumҳама чиз хеле соддатар шуд:
public enum Month {

   JANUARY,
   FEBRUARY,
   MARCH
}

public class HolidayReminder {

   public void printHolidays(Month month) {

       switch (month) {

           case JANUARY:
               System.out.println("7 января будет Рождество!");
               break;
           case FEBRUARY:
               System.out.println("В феврале празднуется День Защитника Отечества - 23 февраля!");
               break;
           case MARCH:
               System.out.println("В марте отмечается Всемирный Женский День - 8 марта!");
               break;
       }
   }
}



public class Main {

   public static void main(String[] args) {

       HolidayReminder reminder = new HolidayReminder();
       reminder.printHolidays(Month.JANUARY);

   }

}
Натиҷаи консол:

7 января будет Рождество!
Лутфан таваҷҷӯҳ намоед: дастрасӣ ба an objectҳо Enum, мисли пеш аз Java 1.5 статикӣ боқӣ мемонад. Барои дастрасӣ ба моҳҳо ба мо лозим нест, ки an object эҷод кунем Month. Дар вакти кор кардан бо руйхатхо фаромуш кардан лозим нест, ки Enumин синфи мукаммал аст. Ин маънои онро дорад, ки агар лозим бошад, шумо метавонед конструкторҳо ва усулҳоро дар он муайян кунед. Масалан, дар порчаи пешинаи code мо танҳо арзишҳоро ЯНВАР, ФЕВРАЛ, МАРТ муайян кардем. Бо вуҷуди ин, мо метавонем доираи худро enum Monthчунин васеъ кунем:
public enum Month {

   JANUARY("Январь", 31),
   FEBRUARY("Февраль", 28),
   MARCH("Март", 31),
   APRIL("Апрель", 30),
   MAY("Май", 31),
   JUNE("Июнь", 30),
   JULY("Июль", 31),
   AUGUST("Август", 31),
   SEPTEMBER("Сентябрь", 30),
   OCTOBER("Октябрь", 31),
   NOVEMBER("Ноябрь", 30),
   DECEMBER("Декабрь", 31);

   private String name;
   private int daysCount;

   Month(String name, int daysCount) {
       this.name = name;
       this.daysCount = daysCount;
   }

   public static Month[] getWinterMonths() {

       return new Month[]{DECEMBER, JANUARY, FEBRUARY};
   }

   public static Month[] getSummerMonths() {

       return new Month[]{JUNE, JULY, AUGUST};
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public int getDaysCount() {
       return daysCount;
   }

   public void setDaysCount(int daysCount) {
       this.daysCount = daysCount;
   }

   @Override
   public String toString() {
       return "Month{" +
               "name='" + name + '\'' +
               ", daysCount=" + daysCount +
               '}';
   }
}
Дар ин ҷо мо ба майдони худ 2 майдонро илова кардем enum- номи моҳ ва шумораи рӯзҳо, созандае, ки ин майдонҳоро истифода мебарад, танзимкунандаҳо, метод toString()ва инчунин 2 усули статикӣ. Тавре ки шумо мебинед, дар ин бобат ҳеҷ мушкиле вуҷуд надошт: тавре ки мо қаблан гуфта будем, enumин синфи пурра аст:
import java.util.Arrays;

public class Main {

   public static void main(String[] args) {

       System.out.println(Arrays.toString(Month.getSummerMonths()));

   }

}
Натиҷаи консол:

[Month{name='Июнь', daysCount=30}, Month{name='Июль', daysCount=31}, Month{name='Август', daysCount=31}]
Дар ниҳоят, ман мехоҳам ба шумо як китоби бениҳоят муфидро дар бораи Java тавсия диҳам, яъне "Java самаранок" аз ҷониби Ҷошуа Блок . Enum.  Намунаҳои амалӣ.  Илова кардани конструкторҳо ва усулҳо - 3Муаллиф яке аз созандагони Java аст, бинобар ин шумо метавонед бешубҳа ба маслиҳати ӯ оид ба истифодаи дуруст ва салоҳиятноки воситаҳои забонӣ бовар кунед :) Дар робита ба лексияи мо, ман ба шумо маслиҳат медиҳам, ки ба боби китоб, ки ба enum. Хониши самаранок дошта бошед! :)
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION