Értékek csatolása a Java Enumhoz

1. Bemutatkozás

A Java enum type a nyelv által támogatott módszert kínálja az állandó értékek létrehozására és használatára. Véges értékkészlet meghatározásával a enum típusbiztosabb, mint az állandó szó szerinti változók, mint a Húr vagy int.

Azonban, enum Az értékeknek érvényes azonosítóknak kell lenniük, és javasoljuk, hogy egyezzen a SCREAMING_SNAKE_CASE használatával.

Ezeket a korlátozásokat figyelembe véve a enum Az érték önmagában nem alkalmas ember által olvasható karakterláncokhoz vagy nem karakterláncokhoz.

Ebben az oktatóanyagban a enumJava-osztályként funkcionál a kívánt értékek csatolásához.

2. Java használata Enum osztályként

Gyakran létrehozunk egy enum mint egyszerű értéklista. Például itt van a periódusos rendszer első két sora egyszerűként enum:

public enum elem {H, HE, LI, BE, B, C, N, O, F, NE}

A fenti szintaxist felhasználva tíz statikus, végső példányt hoztunk létre enum nevezett Elem. Bár ez nagyon hatékony, csak az elem szimbólumokat rögzítettük. És bár a nagybetűs forma megfelel a Java állandóknak, a szimbólumokat általában nem így írjuk.

Továbbá hiányoznak a periódusos rendszer egyéb tulajdonságai, például a név és az atomtömeg.

Habár a enum A type speciális viselkedést mutat a Java-ban, hozzáadhatunk konstruktorokat, mezőket és módszereket, mint más osztályokkal. Emiatt javíthatjuk a mi képességeinket enum hogy a szükséges értékeket belefoglaljuk.

3. Konstruktor és egy utolsó mező hozzáadása

Kezdjük az elemnevek hozzáadásával. A neveket a-ra állítjuk végső változó egy konstruktor segítségével:

public enum Elem {H ("hidrogén"), HE ("hélium"), // ... NE ("neon"); nyilvános String címke; privát elem (String label) {this.label = label; }}

Először is a speciális szintaxist vesszük észre a deklarációs listában. Így hívják meg a konstruktort enum típusok. Bár illegális a új üzemeltetője egy enum, konstruktor argumentumokat adhatunk át a deklarációs listában.

Ezután deklarálunk egy példányváltozót címke. Néhány dolgot meg kell jegyezni erről.

Először is a címke azonosító a név. Bár a tagmező név elérhető, válasszuk címke hogy elkerüljék az összetévesztést az előre meghatározottakkal Enum.name () módszer.

Másodszor, a mi címke mező az végső. Míg egy enum nem kell végső, az esetek többségében nem akarjuk, hogy a címkénk megváltozzon. Szellemében enum az értékek állandóak, ennek van értelme.

Végül a címke mező nyilvános. Ezért közvetlenül hozzáférhetünk a címkéhez:

System.out.println (BE.label);

Másrészt a mező lehet magán, elérhető a getLabel () módszer. A rövidség érdekében ez a cikk továbbra is a nyilvános mező stílusát fogja használni.

4. A Java keresése Enum Értékek

A Java biztosítja a valueOf (karakterlánc) módszer mindenki számára enum típusok. Így mindig kaphatunk egy enum érték a deklarált név alapján:

assertSame (Element.LI, Element.valueOf ("LI"));

Érdemes azonban felkutatnunk egy enum értéket a címke mezőnkben is. Ehhez hozzáadhatunk a statikus módszer:

public static Element valueOfLabel (String label) {for (Element e: values ​​()) {if (e.label.equals (label)) {return e; }} return null; }

A statikus valueOfLabel () módszer iterálja a Elem értékeket, amíg talál egyezést. Visszatér nulla ha nem található egyezés. Ezzel szemben visszatérés helyett kivételt lehetne vetni nulla.

Lássunk egy gyors példát a mi használatunkra valueOfLabel () módszer:

assertSame (Element.LI, Element.valueOfLabel ("Lítium"));

5. A keresési értékek gyorsítótárba helyezése

Kerülhetjük a enum értékeket az a használatával Térkép gyorsítótárba helyezni a címkéket. Ehhez meghatározzuk a statikus végleges térkép és töltse fel, amikor az osztály betöltődik:

public enum Element {// ... enum értékek private static final Map BY_LABEL = new HashMap (); statikus {for (Elem e: értékek ()) {BY_LABEL.put (e.címke, e); }} // ... mezők, konstruktor, módszerek public static Element valueOfLabel (String label) {return BY_LABEL.get (label); }}

A gyorsítótárazás eredményeként a enum az értékeket csak egyszer ismételjük meg, és a valueOfLabel () módszer egyszerűsödik.

Alternatív megoldásként lustán szerkeszthetjük a gyorsítótárat, amikor először elérjük a valueOfLabel () módszer. Ebben az esetben a térképelérést szinkronizálni kell a párhuzamossági problémák elkerülése érdekében.

6. Több érték csatolása

A Enum a konstruktor több értéket is elfogadhat. Illusztrációként adjuk hozzá az atomszámot an-ként int és az atomsúly mint a úszó:

public enum Elem {H ("Hidrogén", 1, 1.008f), HE ("Hélium", 2, 4.0026f), // ... NE ("Neon", 10, 20.180f); privát statikus végleges térkép BY_LABEL = új HashMap (); privát statikus végleges térkép BY_ATOMIC_NUMBER = új HashMap (); privát statikus végleges térkép BY_ATOMIC_WEIGHT = új HashMap (); statikus {for (Elem e: értékek ()) {BY_LABEL.put (e.címke, e); BY_ATOMIC_NUMBER.put (e.atomicNumber, e); BY_ATOMIC_WEIGHT.put (e.atomicWeight, e); }} public final String label; public final int atomicNumber; nyilvános végső úszó atomicWeight; privát elem (String label, int atomicNumber, float atomicWeight) {this.label = label; this.atomicNumber = atomicNumber; this.atomicWeight = atomicWeight; } public static Element valueOfLabel (String label) {return BY_LABEL.get (label); } public static Element valueOfAtomicNumber (int szám) {return BY_ATOMIC_NUMBER.get (szám); } public static Element valueOfAtomicWeight (float weight) {return BY_ATOMIC_WEIGHT.get (weight); }}

Hasonlóképpen hozzáadhatunk tetszőleges értékeket a enum, például a megfelelő kis- és nagybetűk szimbólumai, például a „He”, a „Li” és a „Be”.

Sőt, hozzáadhatunk számított értékeket is enum módszerek hozzáadásával a műveletek végrehajtására.

7. Az interfész vezérlése

Mezők és módszerek hozzáadása eredményeként enum, megváltoztattuk a nyilvános felületét. Ezért a magunkat használó kódunk Enumnév() és értéke() módszerek, nem lesznek tisztában új területeinkkel.

A statikusértéke() metódust már a Java nyelv definiálja számunkra. Ezért nem tudjuk biztosítani a sajátjainkat értéke() végrehajtás.

Hasonlóképpen, mert a Enum.name () módszer az végső, mi sem tudjuk felülírni.

Ennek eredményeként nincs gyakorlati módja annak, hogy extra mezőinket kihasználjuk a szabvány használatával Enum API. Ehelyett nézzünk meg néhány különböző módot a mezők bemutatására.

7.1. Felülbíráló toString ()

Felülbíráló toString () alternatívája lehet az elsőbbségnek név():

@Orride public String toString () {return this.label; }

Alapértelmezés szerint, Enum.toString () ugyanazt az értéket adja vissza, mint Enum.name ().

7.2. Interfész megvalósítása

A enum típusú Java képes interfészeket megvalósítani. Bár ez a megközelítés nem annyira általános, mint a Enum Az API, az interfészek segítenek bennünket az általánosításban.

Vegyük fontolóra ezt a felületet:

nyilvános felület Címkézett {String label (); }

A következetesség érdekében a Enum.name () módszer, a mi címke() módszer nem rendelkezik a kap előtag.

És, mert a valueOfLabel () módszer az statikus, nem vesszük fel a felületünkre.

Végül megvalósíthatjuk az interfészt a mi enum:

public enum Element implementated Labeled {// ... @Orride public String label () {return label; } // ...}

Ennek a megközelítésnek az egyik előnye, hogy a Címkézve interfész bármilyen osztályra alkalmazható, nemcsak enum típusok. Ahelyett, hogy az általánosra támaszkodna Enum API, most már van egy kontextusspecifikusabb API.

8. Következtetés

Ebben a cikkben a Java számos funkcióját megvizsgáltuk Enum végrehajtás. Konstruktorok, mezők és módszerek hozzáadásával azt látjuk, hogy a enum sokkal többet tehet, mint a szó szerinti konstansok.

Mint mindig, a cikk teljes forráskódja megtalálható a GitHubon.