JavaRush /Java Blog /Random-TL /Enum sa Java: kung paano gamitin ang klase

Enum sa Java: kung paano gamitin ang klase

Nai-publish sa grupo
Kamusta! Sa artikulong ito sasabihin ko sa iyo ang tungkol sa Java Enums. Isipin na binigyan ka ng isang gawain: lumikha ng isang klase na nagpapatupad ng mga araw ng linggo . Sa unang tingin, walang kumplikado tungkol dito, at magiging ganito ang hitsura ng iyong 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 + '\'' +
               '}';
   }
}
At tila maayos ang lahat, ngunit may isang problema: maaari mong ipasa ang anumang teksto sa tagabuo ng klase ng DayOfWeek . Sa ganitong paraan, maaaring gawin ng isang tao ang araw ng linggong "Frog", "Cloud" o "azaza322". Malinaw na hindi ito ang pag-uugali na inaasahan namin, dahil mayroon lamang 7 tunay na araw ng linggo, at bawat isa sa kanila ay may pangalan. Samakatuwid, ang aming gawain ay upang kahit papaano ay limitahan ang saklaw ng mga posibleng halaga para sa klase ng " araw ng linggo ". Bago ang Java 1.5, napilitan ang mga developer na makabuo ng solusyon sa problemang ito sa kanilang sarili, dahil walang handa na solusyon sa wika mismo. Noong mga panahong iyon, kung ang sitwasyon ay nangangailangan ng limitadong bilang ng mga halaga, ginawa nila ito:
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 + '\'' +
               '}';
   }
}
Ano ang dapat mong bigyang pansin dito:
  • Pribadong tagabuo. Kung ang isang constructor ay minarkahan ng pribadong modifier , ang isang object ng klase ay hindi maaaring gawin gamit ang constructor na iyon. At dahil isa lang ang constructor sa klase na ito, ang DayOfWeek object ay hindi maaaring gawin.

    public class Main {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = new DayOfWeek();//error!
       		}
    }
  • Kasabay nito, naglalaman ang klase ng kinakailangang bilang ng mga pampublikong static na bagay na nasimulan sa paraang kailangan namin (tama ang mga pangalan ng mga araw).

    Ginawa nitong posible na gumamit ng mga bagay sa ibang mga klase.

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

    Konklusyon:

    DayOfWeek{title='Linggo'}

Ang pamamaraang ito ay higit na nagbigay-daan sa amin upang malutas ang problema. Mayroon kaming 7 araw ng linggo sa aming pagtatapon, at walang makakagawa ng mga bago. Ang solusyon na ito ay iminungkahi ni Joshua Bloch sa aklat na Effective Java . Ang libro, sa pamamagitan ng paraan, ay napaka-cool at dapat basahin para sa sinumang developer ng Java.
Paano gamitin ang Enum class - 2
Sa paglabas ng Java 1.5, ipinakilala ng wika ang isang handa na solusyon para sa mga ganitong sitwasyon - ang Enum enumeration . Enum ay isang klase din. Ngunit ito ay espesyal na "iniayon" upang malutas ang mga problemang katulad ng sa atin: ang paglikha ng isang tiyak na limitadong hanay ng mga halaga. Dahil ang mga tagalikha ng Java ay mayroon nang mga yari na halimbawa (sabihin, ang wikang C, kung saan umiiral na ang Enum ), nagawa nilang lumikha ng pinakamainam na opsyon.

Ano ang enum?

Kaya, ano ang Enum sa Java ? Tingnan natin ang halimbawa ng parehong DayOfWeek :
public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Ito ay mukhang mas simple :) Sa loob ng aming Enum mayroong 7 constants na may static na access. Magagamit na natin ito para ipatupad ang lohika sa programa. Halimbawa, sumulat tayo ng isang programa na tutukuyin kung ang isang mag-aaral ay kailangang pumasok sa paaralan ngayon. Ang aming mag-aaral ay magkakaroon ng kanyang pang-araw-araw na gawain, na itinalaga ng klase ng ScholarSchedule :
public class ScholarSchedule {

   private DayOfWeek dayOfWeek;
   //...other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
Tinutukoy ng dayOfWeek variable sa day mode kung anong araw ito. At narito ang klase ng aming estudyante:
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 :(");
       }
   }
}
Sa paraan ng wakeUp() , gamit ang Enum, tinutukoy namin ang mga karagdagang aksyon ng mag-aaral. Ni hindi namin inilarawan nang detalyado kung ano ang ibig sabihin ng bawat variable sa DayOfWeek , at hindi ito kailangan: halata na ang mekanismo ng mga araw ng linggo, at kung gagamitin namin ito sa kasalukuyang anyo nito, mauunawaan ng sinumang developer kung ano ay nangyayari sa iyong code. Ang isa pang halimbawa ng kaginhawaan ng Enum ay ang mga constant nito ay maaaring gamitin sa isang switch statement . Halimbawa, sumusulat kami ng isang programa para sa isang mahigpit na diyeta, kung saan ang mga pagkain ay naka-iskedyul sa araw:
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
       }
   }
}
Ito ay isa sa mga pakinabang ng Enum kaysa sa lumang solusyon na ginamit bago ang Java 1.5: ang lumang solusyon ay hindi magagamit sa switch .

Ano pa ang kailangan mong malaman tungkol sa klase ng Enum?

Ang klase ng Enum ay isang tunay na klase na may lahat ng mga kakayahan na kasama nito. Halimbawa, kung ang kasalukuyang pagpapatupad ng mga araw ng linggo ay hindi sapat para sa iyo, maaari kang magdagdag ng mga variable, constructor at pamamaraan sa 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 + '\'' +
               '}';
   }
}
Ang mga constant ng aming Enum ay mayroon na ngayong isang field ng pamagat , isang getter, at isang na-override na paraan ng toString . Kung ikukumpara sa mga regular na klase, ang Enum ay may isang seryosong limitasyon - hindi ito maaaring magmana. Bilang karagdagan, ang mga enumerasyon ay may mga pamamaraan na natatangi sa kanila:
  • values() : nagbabalik ng array ng lahat ng values ​​na nakaimbak sa Enum :

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

    Konklusyon:

    [DayOfWeek{title='Sunday'}, DayOfWeek{title='Monday'}, DayOfWeek{title='Martes'}, DayOfWeek{title='Wednesday'}, DayOfWeek{title='Thursday'}, DayOfWeek{title= 'Biyernes'}, DayOfWeek{title='Saturday'}]

  • ordinal() : ibinabalik ang ordinal na numero ng isang pare-pareho. Ang countdown ay nagsisimula sa zero:

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

    Konklusyon:

    0

  • valueOf() : Nagbabalik ng Enum object na tumutugma sa ibinigay na pangalan:

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

    Konklusyon:

    DayOfWeek{title='Linggo'}

Bigyang-pansin:Pina-capitalize namin ang mga pangalan ng mga elemento ng Enum dahil ang mga ito ay mga constant at itinalaga bilang mga constant, hindi camelCase .
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION