1. Háttér, hogyan enum
jött létre
Ma egy másik típusú adattípust fogunk felfedezni a Java nyelvben: enum
. A név a felsorolásenum
szóból származik . Mi ez az adattípus és mire való?
Néha a programozónak új adattípust kell létrehoznia, amelynek lehetséges értékei egy kis rögzített listára korlátozódnak.
Például egy típus csak a , , , ... DayOfTheWeek
értékeket veheti fel. Összesen 7 érték van. Vagy egy típus csak a , , , ... értékeket veheti fel. Összesen 12 érték van.MONDAY
TUESDAY
WEDNESDAY
Month
JANUARY
FEBRUARY
MARCH
Természetesen használhatsz számokat (a int
típust): 1
— Hétfő, 2
— Kedd stb. De előfordulhat, hogy valaki véletlenül érvénytelen értékeket rendel a változójához, például 8
vagy .0
Könnyen előfordulhat, hogy az egyik programozó azt gondolja, hogy a hét napjai (vagy az év hónapjai) nullától kezdődően vannak számozva, míg mások azt várják, hogy a számozás egytől induljon stb.
Ezért vezette be a Java , egy véges értékkészletbőlenum
álló adattípust .
2. Típus deklarálása
Az új enum
adattípus deklarálása így néz ki:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Hol TypeName
van az új típus (osztály) neve, és a lehetséges értékeket vesszővel választjuk el, és kapcsos zárójelbe foglaljuk: Value1
, Value2
, Value3
.
Példaként hozzuk létre a sajátunkat DayOfTheWeek
enum
:
Kód | jegyzet |
---|---|
|
Új Day típus hétfő kedd szerda csütörtök péntek szombat vasárnap |
Így rendelhet értéket egy új típusú változóhoz:
Day day = Day.MONDAY;
Példa:
Kód | jegyzet |
---|---|
|
A képernyő kimenete a következő lesz:
|
3. Az anenum
Egy enum
típusnak számos beépített módszere van, amelyek közül kettő nagyon érdekes:
A statikus values()
metódus a következő típusú összes érték tömbjét adja vissza enum
:
Kód | jegyzet |
---|---|
|
A days változó a típus értékeit tartalmazó tömböt tárol Day (7 elem) Jelenítse meg a tömb tartalmát a képernyőn:
|
A ordinal()
metódus az állandó sorszámát adja vissza. Inkább értéknek nevezed, enum
mint osztálynak enum
:
Kód | Konzol kimenet |
---|---|
|
|
4. Osztálytá alakítás
Valójában nincs itt semmi varázslatos. A fordító csak egy kis szintaktikai cukrot adott nekünk. Fordításkor az Day
enum egy közönséges osztállyá alakul:
Kód, egyszerűsített változat | jegyzet |
---|---|
|
Day class Statikus konstansok listája Egy tömb az enum összes értékével Egy változó, amely egy adott objektum értékét tárolja Az osztály privát, ami azt jelenti, hogy az osztály objektumai csak az osztályon belül hozhatók létre . A metódust egy objektumon kell meghívni . Visszaadja az objektum értékét — a mezőt. A metódus egy statikus tömböt ad vissza az osztály összes értékével Day Day Day constructor Day Day ordinal Day value Day |
Ha az összes statikus metódust és változót eltávolítjuk az osztályból Day
, a következőket kapjuk:
Kód | jegyzet |
---|---|
|
A változó az objektum objektumok value értékét tárolja csak az osztályon belül hozható létre , mivel a konstruktor a . A metódus az objektum értékét adja vissza. Day Day Day private ordinal() value Day |
Más szóval, itt nem történik semmi ijesztő. A fordító létrehozza az Day
osztályt, hozzáadja az értékeket reprezentáló konstansokat enum
, hozzáadja a szükséges metódusokat, és elkészíti az osztálykonstruktort private
. Kicsit később megnézzük, hogyan dolgoznak a konstruktőrök.
Remélhetőleg most már világos, hogy miért rendelünk értéket egy változóhoz így:
Day day = Day.MONDAY;
MONDAY
csak egy statikus mező (konstans) az osztályban Day
. Ha az osztályon kívülről ér el statikus metódusokat és mezőket, meg kell adnia az osztály nevét a mező vagy metódus neve előtt.
5. További módszerek anenum
Minden enum
osztálynak számos érdekes funkciója van.
Konvertálás karakterláncra és karakterláncból
Egy enum objektum karakterláncsá alakításához meg kell hívnia a metódusát toString()
.
String str = Day.MONDAY.toString();
A másik irányba (karakterláncból objektummá Day
) történő konvertáláshoz használhatja a statikus valueOf()
módszert:
Day day = Day.valueOf("MONDAY");
Nagyon kényelmes, és sok esetben hasznos lesz.
Számmá konvertálás és vissza
Már tudja, hogyan lehet egy enum
objektumot számmá alakítani: hívja meg a ordinal()
metódust:
int index = Day.MONDAY.ordinal();
A másik irányú konvertáláshoz (számból objektummá Day
) átláthatóbb konstrukcióra van szüksége:
Day day = Day.values()[2];
Példák:
Kód | jegyzet |
---|---|
|
Hétfő A hétfő indexének lekérése: 0 A hét napja 2 nappal a hétfő után |
Fontos szempont: mivel enum
az értékek állandó konstansok fix halmaza, az == használatával összehasonlíthatók . Más szóval, nem lehet két azonos MONDAY
objektum különböző címmel. Minden enumértéknek csak egyetlen példánya létezik. Ez pedig azt jelenti, hogy az enum változók == használatával történő összehasonlítása mindig működni fog.
6. Saját metódusok hozzáadása egyenum
Mivel a enum
fordítási időben egy közönséges osztállyá válik, deklarálhatunk benne metódusokat. Ezeket a metódusokat egyszerűen hozzáadják a fordító által generált osztályhoz. Day enum
Tegyük fel például, hogy tömb helyett az enum értékek listáját szeretnénk visszaadni.
Ezután a következő kódot adhatjuk hozzá:
Kód | jegyzet |
---|---|
|
Az értéklista után pontosvessző szükséges. Objektum létrehozása Adja hozzá az értékeket a metódus által visszaadott tömbben . Vissza a listát. ArrayList values() |
Most ez a módszer kódban hívható:
Kód | jegyzet |
---|---|
|
A list változó tárolja az összes érték listáját Day enum . |
GO TO FULL VERSION