1. Háttér, hogyan enumjö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.MONDAYTUESDAYWEDNESDAYMonthJANUARYFEBRUARYMARCH
Természetesen használhatsz számokat (a inttí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 8vagy .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 enumadattípus deklarálása így néz ki:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Hol TypeNamevan 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 Daytí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 enumtí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 daysvá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, enummint 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 Dayenum egy közönséges osztállyá alakul:
| Kód, egyszerűsített változat | jegyzet |
|---|---|
|
Dayclass 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 DayDayDayconstructorDayDayordinalDayvalueDay |
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. DayDayDayprivateordinal()valueDay |
Más szóval, itt nem történik semmi ijesztő. A fordító létrehozza az Dayosztá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;
MONDAYcsak 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 enumosztá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 enumobjektumot 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 enumaz értékek állandó konstansok fix halmaza, az == használatával összehasonlíthatók . Más szóval, nem lehet két azonos MONDAYobjektum 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 enumfordí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 enumTegyü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. ArrayListvalues() |
Most ez a módszer kódban hívható:
| Kód | jegyzet |
|---|---|
|
A listváltozó tárolja az összes érték listáját Day enum. |
GO TO FULL VERSION