JavaRush /Java Blog /Random-TK /Java-da Enum: Synpy nädip ulanmaly

Java-da Enum: Synpy nädip ulanmaly

Toparda çap edildi
Salam! Bu makalada size Java Enums hakda gürrüň bererin. Size bir wezipe berilendigini göz öňüne getiriň: hepdäniň günlerini ýerine ýetirýän synp dörediň . Bir seretseň, bu ýerde çylşyrymly zat ýok we koduňyz şuňa meňzeýär:
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 + '\'' +
               '}';
   }
}
Hemme zat gowy ýaly bolup görünýär, ýöne bir mesele bar: islendik teksti DayOfWeek synpynyň konstruktoryna geçirip bilersiňiz . Şeýlelik bilen, kimdir biri "Gurbaga", "Bulut" ýa-da "azaza322" hepdäniň gününi döredip biler. Bu, biziň garaşýan häsiýetimiz däl, sebäbi hepdäniň bary-ýogy 7 güni bar we olaryň hersiniň ady bar. Şonuň üçin biziň wezipämiz “ hepdäniň güni ” synpy üçin mümkin bolan gymmatlyklaryň çägini çäklendirmekdir . Java 1.5-den öň işläp düzüjiler bu meseläniň çözgüdini özbaşdak tapmaga mejbur boldular, sebäbi diliň özünde taýyn çözgüt ýokdy. Şol günlerde ýagdaý çäkli mukdarda gymmatlyklary talap edýän bolsa, muny etdiler:
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 + '\'' +
               '}';
   }
}
Bu ýerde üns bermeli zatlaryňyz:
  • Hususy konstruktor. Konstruktor şahsy üýtgediji bilen bellenen bolsa , şol konstruktoryň kömegi bilen synpyň obýekti döredilip bilinmez. Bu synpda diňe bir konstruktor barlygy sebäpli, DayOfWeek obýekti asla döredilip bilinmez.

    public class Main {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = new DayOfWeek();//error!
       		}
    }
  • Şol bir wagtyň özünde, synpda zerur bolan görnüşde başlanan köpçülikleýin statiki obýektler bardy (günleriň atlary dogry).

    Bu zatlary beýleki synplarda ulanmaga mümkinçilik berdi.

    public class Man {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = DayOfWeek.SUNDAY;
    
           			System.out.println(sunday);
      		 }
    }

    Netije:

    DayOfWeek {title = 'Sunday'}

Bu çemeleşme köplenç meseläni çözmäge mümkinçilik berdi. Hepdäniň 7 güni biziň ygtyýarymyzda, hiç kim täzesini döredip bilmedi. Bu çözgüt Joşua Bloç tarapyndan “Effektiv Java” kitabynda teklip edildi . Theeri gelende aýtsak, kitap gaty gowy we islendik Java dörediji üçin hökman okalmaly.
Enum synpyny nädip ulanmaly - 2
Java 1.5-iň çykmagy bilen dil şeýle ýagdaýlar üçin taýýar çözgüt hödürledi - Enum sanamak . Enum hem synpdyr. Ouröne biziňkä meňzeş meseleleri çözmek üçin ýörite “ýöriteleşdirilen”: belli bir çäkli gymmatlyklary döretmek. “Java” döredijilerinde eýýäm taýyn mysallar bar ( Enumyň eýýäm bar bolan C dili), şonuň üçin iň amatly warianty döretmegi başardylar.

Enum näme?

Onda, Java-da Enum näme ? Şol bir DayOfWeek- iň mysalyna seredeliň :
public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Bu eýýäm has ýönekeý görünýär :) Enumymyzyň içinde statiki girişli 7 sany yzygiderli bar. Programmada logikany durmuşa geçirmek üçin eýýäm ulanyp bileris. Mysal üçin, bir okuwçynyň şu gün mekdebe gitmelidigini ýa-da ýokdugyny kesgitleýän programma ýazalyň. ScholarSchedule synpy tarapyndan kesgitlenen okuwçymyzyň gündelik işi bolar :
public class ScholarSchedule {

   private DayOfWeek dayOfWeek;
   //...other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
Gün tertibinde DayOfWeek üýtgeýjisi onuň haýsy gündigini kesgitleýär. Ine, biziň okuwçymyzyň synpy:
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 () usulynda , Enum ulanyp , okuwçynyň mundan beýläkki hereketlerini kesgitleýäris. “DayOfWeek” -däki her üýtgeýjiniň nämäni aňladýandygyny jikme-jik düşündirip bilmedik , bu zerur däl: hepdäniň günleriniň mehanizmi eýýäm görnüp dur we häzirki görnüşinde ulansak, islendik dörediji nämä düşüner koduňyzda bolup geçýär. “Enum” -yň amatlylygynyň başga bir mysaly, yzygiderliligini wyklýuçatel beýany bilen ulanyp bolýar . Mysal üçin, naharlar gün tertibinde berk iýmitlenmek üçin programma ýazýarys:
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
       }
   }
}
Bu, Enumyň Java 1.5-den öň ulanylan köne çözgüdiň artykmaçlyklaryndan biridir : köne çözgüdi wyklýuçatel bilen ulanyp bolmaz .

Enum synpy barada başga näme bilmeli?

Enum synpy, ähli mümkinçilikleri bolan hakyky synpdyr. Mysal üçin, hepdäniň günleriniň häzirki durmuşa geçirilmegi size ýeterlik bolmasa, DayOfWeek- e üýtgeýänleri, konstruktorlary we usullary goşup bilersiňiz:
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-yň yzygiderliliginde indi at meýdançasy , gazanýan weString usuly ýok . Adaty sapaklar bilen deňeşdirilende, Enumyň çynlakaý çäklendirmesi bar - ony miras alyp bolmaz. Mundan başga-da, sanamagyň olara mahsus usullary bar:
  • values ​​() : Enum- da saklanýan ähli bahalaryň massiwini görkezýär:

    public static void main(String[] args) {
       		System.out.println(Arrays.toString(DayOfWeek.values()));
    }

    Netije:

    [DayOfWeek {title = 'Sunday'}, DayOfWeek {title = 'Duşenbe'}, DayOfWeek {title = 'Sişenbe'}, DayOfWeek {title = 'Çarşenbe'}, DayOfWeek {title = 'Penşenbe'}, DayOfWeek {title = 'Juma'}, DayOfWeek {title = 'Şenbe'}]

  • ordinal () : üýtgewsizleriň nominal sanyny görkezýär. Sanamak noldan başlaýar:

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

    Netije:

    0

  • valueOf () :Berlen ada gabat gelýän Enum obýektini görkezýär:

    public static void main(String[] args) {
       DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY");
       System.out.println(sunday);
    }

    Netije:

    DayOfWeek {title = 'Sunday'}

Üns beriň:Enum elementleriniň atlaryny baş harp bilen ýazýarys, sebäbi olar yzygiderli we düýe däl-de, hemişelik hökmünde bellenilýär .
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION