1. Bakgrunn for hvordan enum
ble til
I dag skal vi utforske en annen type datatype i Java: enum
. Navnet enum
kommer fra ordet oppregning . Hva er denne datatypen og hva er den for?
Noen ganger må en programmerer opprette en ny datatype, hvis mulige verdier er begrenset til en liten fast liste.
For eksempel DayOfTheWeek
kan en type bare ta verdiene MONDAY
, TUESDAY
, WEDNESDAY
, ... Det er 7 verdier totalt. Eller en Month
type kan bare ta verdiene JANUARY
, FEBRUARY
, MARCH
, ... Det er totalt 12 verdier.
Selvfølgelig bruker du kunne tall ( int
typen): 1
— Mandag, 2
— Tirsdag, osv. Men noen kan ved et uhell tildele ugyldige verdier som 8
eller 0
til variabelen din.
Du kan lett ha en situasjon der en programmerer tror ukedagene (eller månedene i året) er nummererte fra null, mens andre forventer at nummereringen deres starter fra én osv.
Det er derfor Java introduserte enum
, en datatype som består av et begrenset sett med verdier .
2. Erklære en type
Å erklære en ny enum
datatype ser slik ut:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Hvor TypeName
er navnet på den nye typen (klassen), og de mulige verdiene er atskilt med komma og pakket inn i krøllete klammeparenteser: Value1
, Value2
, Value3
.
Som et eksempel, la oss lage vår egen DayOfTheWeek
enum
:
Kode | Merk |
---|---|
|
Ny Day type mandag tirsdag onsdag torsdag fredag lørdag søndag |
Slik tildeler du en verdi til en variabel av vår nye type:
Day day = Day.MONDAY;
Eksempel:
Kode | Merk |
---|---|
|
Skjermutgangen vil være:
|
3. Metoder for enenum
En enum
type har flere innebygde metoder, hvorav to er veldig interessante:
Den statiske values()
metoden returnerer en matrise med alle verdiene av enum
typen:
Kode | Merk |
---|---|
|
Variabelen days lagrer en matrise som inneholder verdiene av Day typen (7 elementer) Vis innholdet i matrisen på skjermen:
|
Metoden ordinal()
returnerer ordenstallet til konstanten. Du kaller det på en enum
verdi i stedet for en enum
klasse:
Kode | Konsollutgang |
---|---|
|
|
4. Konvertering til en klasse
I virkeligheten er det ikke noe magisk her. Kompilatoren ga oss bare litt syntaktisk sukker. Ved kompilering Day
blir enumet konvertert til en vanlig klasse:
Kode, forenklet versjon | Merk |
---|---|
|
Day klasse Liste over statiske konstanter En matrise med alle verdiene av Day enum En variabel som lagrer verdien til et spesifikt Day objekt Klassens er privat, noe som betyr at objekter i Day klassen kun kan opprettes inne i klassen. Metoden må kalles på et objekt. Den returnerer objektets verdi - feltet. Metoden returnerer en statisk matrise med alle verdiene til klassenconstructor Day Day ordinal Day value Day |
Hvis vi fjerner alle statiske metoder og variabler fra klassen Day
, får vi følgende:
Kode | Merk |
---|---|
|
Variabelen value lagrer verdien av Day objektobjektene Day kan bare opprettes inne i Day klassen, siden konstruktøren er private . Metoden ordinal() returnerer til value objektet Day . |
Det skjer med andre ord ikke noe skummelt her. Kompilatoren oppretter Day
klassen, legger til konstantene som representerer verdiene enum
, legger til de nødvendige metodene og lager klassekonstruktøren private
. Vi skal se på hvordan konstruktører jobber litt senere.
Forhåpentligvis er det nå klart hvorfor vi tildeler en verdi til en variabel på denne måten:
Day day = Day.MONDAY;
MONDAY
er bare et statisk felt (konstant) i Day
klassen. Når du får tilgang til statiske metoder og felt utenfor klassen, må du angi klassenavnet før navnet på feltet eller metoden.
5. Flere metoder for enenum
Hver enum
klasse har flere interessante funksjoner.
Konvertering til og fra en streng
For å konvertere et enum-objekt til en streng, må du kalle metoden toString()
.
String str = Day.MONDAY.toString();
For å konvertere i den andre retningen (fra en streng til et Day
objekt), kan du bruke den statiske valueOf()
metoden:
Day day = Day.valueOf("MONDAY");
Det er super praktisk og vil være nyttig i mange tilfeller.
Konverterer til et tall og tilbake igjen
Du vet allerede hvordan du konverterer et enum
objekt til et tall: ring ordinal()
metoden:
int index = Day.MONDAY.ordinal();
For å konvertere i den andre retningen (fra et tall til et Day
objekt), trenger du en mer gjennomsiktig konstruksjon:
Day day = Day.values()[2];
Eksempler:
Kode | Merk |
---|---|
|
Mandag Få indeksen for mandag: 0 Ukedag 2 dager etter mandag |
Viktig poeng: fordi enum
verdier er et fast sett med konstanter, kan de sammenlignes med == . Du kan med andre ord ikke ha to identiske MONDAY
objekter med forskjellig adresse. Bare en enkelt forekomst av hver enum-verdi eksisterer. Og det betyr at sammenligning av enum-variabler med == alltid vil fungere.
6. Legge til dine egne metoder til enenum
Fordi en enum
blir til en vanlig klasse ved kompilering, kan du deklarere metoder i den. Disse metodene legges ganske enkelt til klassen som kompilatoren genererer. Anta for eksempel at vi vil at vi Day enum
skal returnere en liste over enum-verdiene i stedet for en matrise.
Deretter kan vi legge til følgende kode:
Kode | Merk |
---|---|
|
Et semikolon kreves etter listen over verdier. Lag et ArrayList objekt Legg til verdiene i matrisen som returneres av values() metoden. Returner listen. |
Nå kan denne metoden kalles i kode:
Kode | Merk |
---|---|
|
Variabelen list vil lagre en liste over alle verdiene til Day enum . |
GO TO FULL VERSION