JavaRush /Java Blog /Random-TK /Java-da Enum. Amaly mysallar. Gurluşykçylary we usullary ...

Java-da Enum. Amaly mysallar. Gurluşykçylary we usullary goşmak

Toparda çap edildi
Salam! Bu gün Java-da ýörite maglumat görnüşi barada gürleşeris - Enum(sanamak üçin gysga). Olaryň aýratynlygy näme? Geliň, programmada birnäçe aý durmuşa geçirmelidigimizi göz öňüne getireliň. Enum.  Amaly mysallar.  Gurluşykçylary we usullary goşmak - 1Görnüşi ýaly, mesele näme? Diňe islendik aýyň haýsy häsiýetleriniň bardygyny kesgitlemeli. Belki, ilki bilen aýyň ady we ondaky günleriň sany gerek. Meseläniň çözgüdi gaty ýönekeý görünýär:
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 +
               '}';
   }
}
Doly toplum! Bizde synp Month, zerur meýdanlar, getters-setters , toString(). Doly bagt üçin goşmaly däl equals()bolsaňyz :) Şeýle-de bolsa, düşünjeli meselämiz bar. hashCode()OPadyňyzda bolsa, OOP-yň esasy artykmaçlyklaryndan biri, hakyky dünýä subýektlerini modellemegi aňsatlaşdyrýar. Oturgyç, awtoulag, planeta - gündelik durmuşdan gelýän bu düşünjeleriň hemmesini abstraksiýa ulanyp bir programmada görkezmek aňsat. Mesele, hakyky dünýädäki käbir guramalaryň manylarynyň çäkli bolmagydyr. Bir ýylda bary-ýogy 4 möwsüm bar. Sazda bary-ýogy 7 bellik bar. Senenamada bary-ýogy 12 aý bar. Okeanyň diňe 11 dosty bar (bu jedelli bolsa-da :)) Başgaça aýdylanda, adaty Java synpy bu guramalary modelleşdirip we tebigy çäklendirmelerine hormat goýup bilmeýär. Biziň synpymyzda Monthähli zerur ugurlar bar. Anotheröne başga bir programmist ony ulansa, hiç kim ony düýbünden däli zatlar döretmäge päsgel bermez:
public class Main {

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

}
Bu programmada peýda bolsa, günäkäri tapmak aňsat bolmaz! MonthBir tarapdan, obýektleri döreden programmist synpyň “ýylyň aýy” manysyna düşünip , beýle bolgusyz zatlary ýazmazdy. Başga bir tarapdan, synp dizaýneriniň özüne beren mümkinçiliklerinden peýdalanýardy. Islendik at we gün sanyny belläp bilerinmi? Ol belledi. Şeýle ýagdaýda näme etmeli? Java diliniň 1.5 wersiýasy çykmazdan ozal, programmistler, açyk aýtsam, ondan çykmaly boldular :) Şol günler aşakdaky gurluşlary döretdiler:
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 +
               '}';
   }
}
Bu ýerde mysaly has gysga saklamak üçin on iki däl-de, aý sanyny üçe aňsatlaşdyrdyk. Şeýle dizaýnlar meseläni çözmäge mümkinçilik berdi. Döredilen obýektleriň opsiýalary hususy konstruktor bilen çäklendirildi:
private Month(String name, int daysCount) {
       this.name = name;
       this.daysCount = daysCount;
   }
Synpy ulanýan programmistler diňe döredip bilmediler Month. Synp döredijisi tarapyndan üpjün edilen şol soňky statiki obýektleri ulanmaga mejbur boldular. Bu bir zat ýalydy:
public class Main {

   public static void main(String[] args) {

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

}
Şeýle-de bolsa, Java döredijiler bar bolan bir meselä üns berdiler. Elbetde, programmistleriň dilde bar bolan gurallary ulanyp çözgüt tapyp bilendikleri gaty gowy zat, ýöne beýle ýönekeý görünmeýär! Belli bir çözgüt gerekdi, hatda täze başlanlar üçinem elýeterli. Java-da şeýle peýda boldy Enum. Aslynda, Enumçäkli baha obýektleriniň toplumyny üpjün edýän Java synpy. Görnüşi:
public enum Month {

   JANUARY,
   FEBRUARY,
   MARCH
}
Kesgitlemede Enummunuň Java synpydygyny görkezdik, ýöne hakykatdanam şeýlemi? Hawa, hatda barlap bileris. Mysal üçin, enum Monthbaşga bir synpdan miras alyp görüň:
public abstract class AbstractMonth {
}

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

   JANUARY,
   FEBRUARY,
   MARCH
}
Näme üçin beýle bolýar? Bir programma ýazanymyzda:
public enum Month
Düzediji bu buýrugy şeýle koda öwürýär:
public Class Month extends Enum
Öňden bilşiňiz ýaly, Java-da birnäçe mirasa rugsat berilmeýär. Şonuň üçin AbstractMonthmiras alyp bilmedik. Bu täze dizaýny nädip Enumulanyp bolar? Meýdanlar bilen köne dizaýndan nähili tapawutlanýar static final? Mysal üçin, köne dizaýn bize öz gymmatlyklarymyzy ekspressiýalarda ulanmaga mümkinçilik bermedi switch. Şu aýda haýsy baýramçylyklaryň belleniljekdigini ýada saljak bir programma döretmek isleýändigimizi göz öňüne getiriň:
public class HolidayReminder {

   public void printHolidays(Month month) {

       switch (month) {

           //error!
           case JANUARY:
       }
   }
}
Görşüňiz ýaly, düzüji ýalňyşlyk goýberýär. Emma Java 1.5 peýda bolansoň enum, hemme zat has ýönekeýleşdi:
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);

   }

}
Konsol çykyşy:

7 января будет Рождество!
Üns beriň: obýektlere giriş EnumJava 1.5-den bolşy ýaly statik bolup galýar. MonthAýlara girmek üçin obýekt döretmeli däl . EnumHasaplamalar bilen iş salyşanyňyzda, munuň doly synpdygyny ýatdan çykarmaly däldiris . Diýmek, zerur bolsa, onda konstruktorlary we usullary kesgitläp bilersiňiz. Mysal üçin, öňki kod bölüminde ANanwar, Fewral, MART bahalaryny kesgitledik. enum MonthŞeýle-de bolsa, biz özümizi şeýle giňeldip bileris :
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 +
               '}';
   }
}
Bu ýerde özümize 2 meýdan goşduk enum- aýyň ady we günleriň sany, bu meýdanlary ulanýan konstruktor, getters-setters, bir usul toString(), şeýle hem 2 statiki usul. Görşüňiz ýaly, bu ýerde hiç hili mesele ýokdy: öňem aýdyşymyz ýaly, enumbu doly hukukly synp:
import java.util.Arrays;

public class Main {

   public static void main(String[] args) {

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

   }

}
Konsol çykyşy:

[Month{name='Июнь', daysCount=30}, Month{name='Июль', daysCount=31}, Month{name='Август', daysCount=31}]
Ahyrynda, size Java-da gaty peýdaly bir kitaby, ýagny Joşua Bloçyň “Netijeli Java” kitabyny maslahat beresim gelýär . Enum.  Amaly mysallar.  Gurluşykçylary we usullary goşmak - 3Authorazyjy “Java” döredijileriň biridir, şonuň üçin dil gurallaryny dogry we başarnykly ulanmak baradaky maslahatyna hökman ynanyp bilersiňiz :) Leksiýamyz bilen baglanyşykly kitabyň bagyşlanan bölümine aýratyn üns bermegiňizi maslahat berýärin enum. Önümli okaň! :)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION