JavaRush /Java блогы /Random-KK /Java тіліндегі санау. Практикалық мысалдар. Конструкторла...

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 негізгі артықшылықтарының бірі - бұл нақты әлем нысандарын модельдеуді жеңілдетеді. Орындық, көлік, планета – күнделікті өмірдегі осы ұғымдардың барлығын абстракцияны пайдаланып бағдарламада көрсету оңай. Мәселе мынада, нақты әлемдегі кейбір субъектілердің мағыналарының қатаң шектеулі ауқымы бар. Бір жылда небәрі 4 мезгіл бар. Музыкада бар болғаны 7 нота бар. Күнтізбеде бар болғаны 12 ай бар. Ocean-ның тек 11 досы бар (бұл даулы болса да :)) Басқаша айтқанда, кәдімгі Java класы бұл нысандарды модельдей алмайды және олардың табиғи шектеулерін құрметтей алмайды. Біздің сыныпта Monthбарлық қажетті өрістер бар. Бірақ егер оны басқа бағдарламашы пайдаланса, оған ешкім мүлдем ақылсыз нысандарды жасауға кедергі болмайды:
public class Main {

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

}
Бұл бағдарламада пайда болса, қылмыскерді табу оңай болмайды! Бір жағынан, an objectілерді жасаған бағдарламашы сыныптың Month«жыл айын» ​​білдіретінін түсініп, мұндай бос сөзді жазбай-ақ қояр еді. Екінші жағынан, ол класс дизайнерінің оған берген мүмкіндіктерін ғана пайдаланып отырды. Кез келген атаулар мен күндер санын тағайындай аламын ба? Ол тағайындады. Мұндай жағдайда не істеу керек? 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 +
               '}';
   }
}
Мұнда мысалды қысқарту үшін айлар санын он екі емес, үшке дейін жеңілдеттік. Мұндай дизайн мәселені шешуге мүмкіндік берді. Жасалған нысандардың опциялары жеке конструктормен шектелген:
private Month(String name, int daysCount) {
       this.name = name;
       this.daysCount = daysCount;
   }
Классты пайдаланатын бағдарламашылар жай ғана жасай алмады Month. Олар сынып әзірлеушісі ұсынған соңғы статикалық нысандарды пайдалануға мәжбүр болды. Бұл келесідей көрінді:
public class Main {

   public static void main(String[] args) {

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

}
Дегенмен, Java әзірлеушілері бар мәселені байқады. Әрине, бағдарламашылардың тілде қол жетімді құралдарды пайдалана отырып шешім таба алғаны өте жақсы, бірақ бұл оңай емес! Тіпті жаңадан бастаушыларға да қолжетімді болатын айқын шешім қажет болды. Java тілінде осылай пайда болды Enum. Негізінде Enumбұл мән an objectілерінің шектеулі жиынтығын қамтамасыз ететін Java класы. Мынадай көрінеді:
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ілерге қол жеткізу EnumJava 1.5 нұсқасына дейін болғандай статикалық болып қалады. MonthАйларға қол жеткізу үшін an object жасаудың қажеті жоқ . 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.  Практикалық мысалдар.  Конструкторлар мен әдістерді қосу – 3Author Java-ны жасаушылардың бірі, сондықтан оның тілдік құралдарды дұрыс және сауатты қолдану жөніндегі кеңесіне сөзсіз сенуге болады :) Біздің дәрісімізге қатысты кітаптың -ға арналған тарауына ерекше назар аударуға кеңес беремін enum. Оқуыңыз нәтижелі болсын! :)
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION