1. Bakgrund om hur enum
kom till
Idag ska vi utforska en annan typ av datatyp i Java: enum
. Namnet enum
kommer från ordet uppräkning . Vad är denna datatyp och vad är den till för?
Ibland behöver en programmerare skapa en ny datatyp, vars möjliga värden är begränsade till en liten fast lista.
Till exempel DayOfTheWeek
kan en typ bara ta värdena , MONDAY
, TUESDAY
, WEDNESDAY
... Det finns 7 värden totalt. Eller en Month
typ kan bara ta värdena , , JANUARY
, FEBRUARY
... MARCH
Det finns totalt 12 värden.
Naturligtvis använder du kundenummer (typen int
): 1
— Måndag, 2
— Tisdag, etc. Men någon kan av misstag tilldela ogiltiga värden som 8
eller 0
till din variabel.
Du kan lätt ha en situation där en programmerare tror att veckodagarna (eller månaderna på året) är numrerade från noll, medan andra förväntar sig att deras numrering börjar från ett, etc.
Det är därför Java introducerade enum
, en datatyp som består av en ändlig uppsättning värden .
2. Deklarera en typ
Att deklarera en ny enum
datatyp ser ut så här:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Var TypeName
är namnet på den nya typen (klassen), och de möjliga värdena är separerade med kommatecken och inslagna i hängslen: Value1
, Value2
, Value3
.
Som ett exempel, låt oss skapa vår egen DayOfTheWeek
enum
:
Koda | Notera |
---|---|
|
Ny Day typ måndag tisdag onsdag torsdag fredag lördag söndag |
Så här tilldelar du ett värde till en variabel av vår nya typ:
Day day = Day.MONDAY;
Exempel:
Koda | Notera |
---|---|
|
Skärmutgången blir:
|
3. Metoder för enenum
En enum
typ har flera inbyggda metoder, varav två är mycket intressanta:
Den statiska values()
metoden returnerar en matris med alla värden av enum
typen:
Koda | Notera |
---|---|
|
Variabeln days lagrar en array som innehåller värdena av Day typen (7 element) Visa innehållet i arrayen på skärmen:
|
Metoden ordinal()
returnerar ordningstalet för konstanten. Du kallar det för ett enum
värde snarare än en enum
klass:
Koda | Konsolutgång |
---|---|
|
|
4. Konvertera till en klass
I verkligheten finns det inget magiskt här. Kompilatorn gav oss bara lite syntaktisk socker. Vid kompilering Day
konverteras enumen till en vanlig klass:
Kod, förenklad version | Notera |
---|---|
|
Day class Lista över statiska konstanter En array med alla värden av Day enum En variabel som lagrar värdet på ett specifikt Day objekt Klassens är privat, vilket innebär att objekt i Day klassen endast kan skapas inuti klassen . Metoden måste anropas på ett objekt. Det returnerar objektets värde - fältet . Metoden returnerar en statisk array med alla värden för klassenconstructor Day Day ordinal Day value Day |
Om vi tar bort alla statiska metoder och variabler från klassen Day
får vi följande:
Koda | Notera |
---|---|
|
Variabeln value lagrar värdet på Day objektobjekten Day kan bara skapas i Day klassen, eftersom konstruktorn är private . Metoden ordinal() returnerar value objektets Day . |
Här händer med andra ord inget läskigt. Kompilatorn skapar Day
klassen, lägger till konstanterna som representerar enum
värdena, lägger till de nödvändiga metoderna och gör klasskonstruktorn private
. Vi ska titta på hur konstruktörer fungerar lite senare.
Förhoppningsvis är det nu klart varför vi tilldelar ett värde till en variabel på det här sättet:
Day day = Day.MONDAY;
MONDAY
är bara ett statiskt fält (konstant) i Day
klassen. När du kommer åt statiska metoder och fält utanför klassen måste du ange klassnamnet före namnet på fältet eller metoden.
5. Fler metoder för enenum
Varje enum
klass har flera intressanta funktioner.
Konvertera till och från en sträng
För att konvertera ett enum-objekt till en sträng måste du anropa dess toString()
metod.
String str = Day.MONDAY.toString();
För att konvertera i den andra riktningen (från en sträng till ett Day
objekt) kan du använda den statiska valueOf()
metoden:
Day day = Day.valueOf("MONDAY");
Det är superbekvämt och kommer att vara till hjälp i många fall.
Konverterar till ett nummer och tillbaka igen
Du vet redan hur man konverterar ett enum
objekt till ett tal: anrop ordinal()
metoden:
int index = Day.MONDAY.ordinal();
För att konvertera i den andra riktningen (från ett tal till ett Day
objekt) behöver du en mer transparent konstruktion:
Day day = Day.values()[2];
Exempel:
Koda | Notera |
---|---|
|
Måndag Hämta index för måndag: 0 Veckodag 2 dagar efter måndag |
Viktig punkt: eftersom enum
värden är en fast uppsättning konstanter kan de jämföras med == . Du kan med andra ord inte ha två identiska MONDAY
objekt med olika adress. Endast en enda instans av varje enumvärde finns. Och det betyder att jämföra enumvariabler med == alltid kommer att fungera.
6. Lägga till dina egna metoder till enenum
Eftersom en enum
förvandlas till en vanlig klass vid kompilering, kan du deklarera metoder i den. Dessa metoder läggs helt enkelt till i klassen som kompilatorn genererar. Anta till exempel att vi vill att vi Day enum
ska returnera en lista med enumvärden snarare än en matris.
Sedan kan vi lägga till följande kod:
Koda | Notera |
---|---|
|
Ett semikolon krävs efter värdelistan. Skapa ett ArrayList objekt Lägg till värdena i arrayen som returneras av values() metoden. Lämna tillbaka listan. |
Nu kan denna metod anropas i kod:
Koda | Notera |
---|---|
|
Variabeln list lagrar en lista över alla värden för Day enum . |