1. Context despre cum enum
a apărut
Astăzi vom explora un alt tip de tip de date în Java: enum
. Numele enum
provine de la cuvântul enumerare . Ce este acest tip de date și pentru ce este?
Uneori, un programator trebuie să creeze un nou tip de date, ale cărui valori posibile sunt limitate la o mică listă fixă.
De exemplu, un DayOfTheWeek
tip poate lua numai valorile MONDAY
, TUESDAY
, WEDNESDAY
, ... Există 7 valori în total. Sau un Month
tip poate lua numai valorile JANUARY
, FEBRUARY
, MARCH
, ... Există 12 valori în total.
Desigur, folosiți numerele pot (tipul int
): 1
— luni, 2
— marți, etc. Dar cineva ar putea atribui accidental valori nevalide, cum ar fi 8
sau 0
variabilei dvs.
Ați putea avea cu ușurință o situație în care un programator crede că zilele săptămânii (sau lunile anului) sunt numerotate începând de la zero, în timp ce alții se așteaptă ca numerotarea lor să înceapă de la unu etc.
De aceea enum
, Java a introdus un tip de date care constă dintr -un set finit de valori .
2. Declararea unui tip
Declararea unui nou enum
tip de date arată astfel:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Unde TypeName
este numele noului tip (clasa), iar valorile posibile sunt separate prin virgule și înfășurate în acolade: Value1
, Value2
, Value3
.
De exemplu, să ne creăm propriul DayOfTheWeek
enum
:
Cod | Notă |
---|---|
|
Day Tip nou Luni Marti Miercuri Joi Vineri Sambata Duminica |
Iată cum atribuiți o valoare unei variabile de noul nostru tip:
Day day = Day.MONDAY;
Exemplu:
Cod | Notă |
---|---|
|
Ieșirea ecranului va fi:
|
3. Metode de anenum
Un enum
tip are mai multe metode încorporate, dintre care două sunt foarte interesante:
Metoda statică values()
returnează o matrice cu toate valorile tipului enum
:
Cod | Notă |
---|---|
|
Variabila days stochează o matrice care conține valorile tipului Day (7 elemente) Afișează conținutul matricei pe ecran:
|
Metoda ordinal()
returnează numărul ordinal al constantei. Îl numești pe o enum
valoare mai degrabă decât pe o enum
clasă:
Cod | Ieșire de consolă |
---|---|
|
|
4. Convertirea într-o clasă
În realitate, nu este nimic magic aici. Compilatorul ne-a dat niște zahăr sintactic. La compilare, Day
enumerarea este convertită într-o clasă obișnuită:
Cod, versiune simplificată | Notă |
---|---|
|
Day class Listă de constante statice Un tablou cu toate valorile enumerarii Day O variabilă care stochează valoarea unui anumit Day obiect Clasa este privată, ceea ce înseamnă că obiectele clasei Day pot fi create numai în interiorul clasei . Metoda trebuie apelată pe un obiect. Returnează valoarea obiectului - câmpul . Metoda returnează un tablou static cu toate valorile claseiconstructor Day Day ordinal Day value Day |
Dacă eliminăm toate metodele și variabilele statice din Day
clasă, obținem următoarele:
Cod | Notă |
---|---|
|
Variabila value stochează valoarea obiectelor Day obiect Day poate fi creată numai în interiorul Day clasei, deoarece constructorul este private . Metoda ordinal() returnează value obiectul Day . |
Cu alte cuvinte, nu se întâmplă nimic înfricoșător aici. Compilatorul creează Day
clasa, adaugă constantele care reprezintă valorile enum
, adaugă metodele necesare și face constructorul clasei private
. Ne vom uita la modul în care lucrează constructorii puțin mai târziu.
Sperăm că acum este clar de ce atribuim o valoare unei variabile în acest fel:
Day day = Day.MONDAY;
MONDAY
este doar un câmp static (constant) în Day
clasă. Când accesați metode și câmpuri statice din afara clasei, trebuie să indicați numele clasei înaintea numelui câmpului sau metodei.
5. Mai multe metode de anenum
Fiecare enum
clasă are câteva caracteristici interesante.
Conversia la și de la un șir
Pentru a converti un obiect enumerare într-un șir, trebuie să apelați toString()
metoda acestuia.
String str = Day.MONDAY.toString();
Pentru a converti în cealaltă direcție (de la un șir la un Day
obiect), puteți utiliza valueOf()
metoda statică:
Day day = Day.valueOf("MONDAY");
Este foarte convenabil și va fi de ajutor în multe cazuri.
Convertirea într-un număr și înapoi din nou
Știți deja cum să convertiți un enum
obiect într-un număr: apelați ordinal()
metoda:
int index = Day.MONDAY.ordinal();
Pentru a converti în cealaltă direcție (de la un număr la un Day
obiect), aveți nevoie de o construcție mai transparentă:
Day day = Day.values()[2];
Exemple:
Cod | Notă |
---|---|
|
Luni Obține indexul lunii: 0 Ziua săptămânii la 2 zile după luni |
Punct important: deoarece enum
valorile sunt un set fix de constante, ele pot fi comparate folosind == . Cu alte cuvinte, nu poți avea două MONDAY
obiecte identice cu adresă diferită. Există doar o singură instanță a fiecărei valori de enumerare. Și asta înseamnă că compararea variabilelor enumerate folosind == va funcționa întotdeauna.
6. Adăugarea propriilor metode la unenum
Deoarece an enum
se transformă într-o clasă obișnuită în timpul compilării, puteți declara metode în ea. Aceste metode sunt pur și simplu adăugate la clasa pe care o generează compilatorul. De exemplu, să presupunem că vrem Day enum
să returnăm o listă cu valorile enumerate mai degrabă decât o matrice.
Apoi putem adăuga următorul cod:
Cod | Notă |
---|---|
|
Este necesar un punct și virgulă după lista de valori. Creați un ArrayList obiect Adăugați valorile din tabloul returnat de values() metodă. Întoarce lista. |
Acum această metodă poate fi apelată în cod:
Cod | Notă |
---|---|
|
Variabila list va stoca o listă cu toate valorile Day enum . |
GO TO FULL VERSION