1. Background kung paano enumnaging

Ngayon ay tutuklasin natin ang isa pang uri ng data type sa Java: enum. Ang pangalan enumay nagmula sa salitang enumeration . Ano ang uri ng data na ito at para saan ito?

Minsan ang isang programmer ay kailangang lumikha ng isang bagong uri ng data, na ang mga posibleng halaga ay limitado sa isang maliit na nakapirming listahan.

Halimbawa, ang isang DayOfTheWeekuri ay maaari lamang kunin ang mga halaga MONDAY, TUESDAY, WEDNESDAY, ... Mayroong 7 halaga sa kabuuan. O ang isang Monthuri ay maaari lamang kumuha ng mga halaga JANUARY, FEBRUARY, MARCH, ... Mayroong 12 halaga sa kabuuan.

Siyempre, gumamit ka ng mga numerong maaaring (ang inturi): 1— Lunes, 2— Martes, atbp. Ngunit maaaring may hindi sinasadyang magtalaga ng mga di-wastong halaga gaya ng 8o 0sa iyong variable.

Madali kang magkaroon ng isang sitwasyon kung saan iniisip ng isang programmer na ang mga araw ng linggo (o mga buwan ng taon) ay binibilang simula sa zero, habang ang iba ay umaasa na ang kanilang pagnunumero ay magsisimula sa isa, atbp.

Iyon ang dahilan kung bakit ipinakilala ng Java ang enum, isang uri ng data na binubuo ng isang may hangganan na hanay ng mga halaga .


2. Pagdedeklara ng isang uri

Ang pagdedeklara ng bagong enumuri ng data ay ganito ang hitsura:

enum TypeName
{
   VALUE1,
   VALUE2,
   VALUE3
}

Nasaan TypeNameang pangalan ng bagong uri (klase), at ang mga posibleng halaga ay pinaghihiwalay ng mga kuwit at nakabalot sa mga kulot na brace: Value1, Value2, Value3.

Bilang halimbawa, gumawa tayo ng sarili nating DayOfTheWeek enum:

Code Tandaan
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
Bagong Dayuri

Lunes
Martes
Miyerkules
Huwebes
Biyernes
Sabado
Linggo

Narito kung paano ka magtatalaga ng value sa isang variable ng aming bagong uri:

Day day = Day.MONDAY;

Halimbawa:

Code Tandaan
Day day = Day.FRIDAY;
System.out.println(day);
Ang output ng screen ay magiging:
FRIDAY


3. Pamamaraan ng isangenum

Ang isang enumuri ay may ilang mga built-in na pamamaraan, dalawa sa mga ito ay lubhang kawili-wili:

Ang static values()na pamamaraan ay nagbabalik ng isang hanay ng lahat ng mga halaga ng enumuri:

Code Tandaan
Day[] days = Day.values();

for (Day day: days)
   System.out.println(day);







System.out.println(days[2]);
Ang daysvariable ay nag-iimbak ng isang array na naglalaman ng mga halaga ng Dayuri (7 elemento)

Ipakita ang mga nilalaman ng array sa screen:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

Ang ordinal()pamamaraan ay nagbabalik ng ordinal na numero ng pare-pareho. Tinatawag mo ito sa isang enumhalaga sa halip na isang enumklase:

Code Output ng console
System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.FRIDAY.ordinal());
System.out.println(Day.SUNDAY.ordinal());
0
4
6


4. Pag-convert sa isang klase

Sa totoo lang, walang mahiwagang bagay dito. Binigyan lang kami ng compiler ng ilang syntactic sugar. Sa oras ng pag-compile, ang Dayenum ay na-convert sa isang ordinaryong klase:

Code, pinasimpleng bersyon Tandaan
public class Day
{
   public static final Day MONDAY = new Day(0);
   public static final Day TUESDAY = new Day(1);
   public static final Day WEDNESDAY = new Day(2);
   public static final Day THURSDAY = new Day(3);
   public static final Day FRIDAY = new Day(4);
   public static final Day SATURDAY = new Day(5);
   public static final Day SUNDAY = new Day(6);

    private static final Day[] array = {MONDAY, TUESDAY,
      WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};

   private final int value;

   private Day (int value)
   {
      this.value = value;
   }

   public int ordinal()
   {
      return this.value;
   }

   public static Day[] values()
   {
      return array;
   }
}
Dayclass

Listahan ng mga static constants







Isang array na may lahat ng value ng Dayenum


Isang variable na nag-iimbak ng value ng isang partikular Dayna object Pribado

ang Dayclass's constructor, na nangangahulugang ang mga object ng Dayklase ay maaari lamang gawin sa loob ng Dayklase.



Ang ordinalpamamaraan ay dapat na tinatawag sa isang Daybagay.

Ibinabalik nito ang halaga ng bagay — ang valuefield.


Ang pamamaraan ay nagbabalik ng isang static na array kasama ang lahat ng mga halaga ng Dayklase

Kung aalisin namin ang lahat ng mga static na pamamaraan at variable mula sa Dayklase, makukuha namin ang sumusunod:

Code Tandaan
public class Day
{
  private int value;

  private Day (int value)
  {
    this.value = value;
  }

  public int ordinal()
  {
    return this.value;
  }
}


Ang valuevariable ay nag-iimbak ng halaga ng Daymga object

Dayobject ay maaari lamang gawin sa loob ng Dayklase, dahil ang constructor ay private. Ibinabalik




ng pamamaraan ang ng bagay. ordinal()valueDay

Sa madaling salita, walang nakakatakot na nangyayari dito. Ang compiler ay lumilikha ng Dayklase, nagdaragdag ng mga constant na kumakatawan sa mga enumhalaga, nagdadagdag ng mga kinakailangang pamamaraan, at gumagawa ng class constructor private. Titingnan natin kung paano gumagana ang mga konstruktor sa ibang pagkakataon.

Sana, malinaw na ngayon kung bakit tayo nagtatalaga ng value sa isang variable sa ganitong paraan:

Day day = Day.MONDAY;

MONDAYay isang static na field lamang (constant) sa Dayklase. Kapag nag-a-access ng mga static na pamamaraan at field mula sa labas ng klase, dapat mong isaad ang pangalan ng klase bago ang pangalan ng field o pamamaraan.



5. Higit pang mga pamamaraan ng isangenum

Ang bawat enumklase ay may ilang mga kagiliw-giliw na tampok.

Pag-convert sa at mula sa isang string

Upang i-convert ang isang enum object sa isang string, kailangan mong tawagan ang toString()pamamaraan nito.

String str = Day.MONDAY.toString();

Upang mag-convert sa kabilang direksyon (mula sa isang string patungo sa isang Daybagay), maaari mong gamitin ang static valueOf()na paraan:

Day day = Day.valueOf("MONDAY");

Ito ay sobrang maginhawa at magiging kapaki-pakinabang sa maraming mga kaso.

Nagko-convert sa isang numero at bumalik muli

Alam mo na kung paano i-convert ang isang enumbagay sa isang numero: tawagan ang ordinal()pamamaraan:

int index = Day.MONDAY.ordinal();

Upang mag-convert sa kabilang direksyon (mula sa isang numero patungo sa isang Daybagay), kailangan mo ng isang mas transparent na konstruksyon:

Day day = Day.values()[2];

Mga halimbawa:

Code Tandaan
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
Lunes
Kunin ang index ng Lunes: 0
Araw ng linggo 2 araw pagkatapos ng Lunes

Mahalagang punto: dahil enumang mga halaga ay isang nakapirming hanay ng mga constant, maaari silang ihambing gamit ang == . Sa madaling salita, hindi ka maaaring magkaroon ng dalawang magkaparehong MONDAYbagay na may magkaibang address. Isang instance lang ng bawat enum value ang umiiral. At nangangahulugan ito na ang paghahambing ng mga variable ng enum gamit ang == ay palaging gagana.



6. Pagdaragdag ng sarili mong pamamaraan sa isangenum

Dahil ang isang enumay nagiging isang ordinaryong klase sa oras ng pag-compile, maaari mong ideklara ang mga pamamaraan dito. Ang mga pamamaraan na ito ay idinagdag lamang sa klase na binubuo ng compiler. Halimbawa, ipagpalagay na gusto naming Day enumibalik namin ang isang listahan ng mga halaga ng enum sa halip na isang array.

Pagkatapos ay maaari naming idagdag ang sumusunod na code:

Code Tandaan
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY;

   public static List<Day> asList()
   {
      ArrayList<Day> list = new ArrayList<Day>();

      Collections.addAll(list, values());

      return list;
   }

}








Ang isang semicolon ay kinakailangan pagkatapos ng listahan ng mga halaga.



Lumikha ng isang ArrayListbagay

Idagdag ang mga halaga sa array na ibinalik ng values()pamamaraan.
Ibalik ang listahan.

Ngayon ang pamamaraang ito ay maaaring tawagin sa code:

Code Tandaan
List<Day> list = Day.asList();
Ang listvariable ay mag-iimbak ng isang listahan ng lahat ng mga halaga ng Day enum.