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 |
|---|---|
|
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 |
|---|---|
|
Ang output ng screen ay magiging: |
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 |
|---|---|
|
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: |
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 |
|---|---|
|
|
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 |
|---|---|
|
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 |
|---|---|
|
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 |
|---|---|
|
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 |
|---|---|
|
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 |
|---|---|
|
Ang listvariable ay mag-iimbak ng isang listahan ng lahat ng mga halaga ng Day enum. |
GO TO FULL VERSION