1. Baggrund for hvordan enum
blev til
I dag vil vi udforske en anden slags datatype i Java: enum
. Navnet enum
kommer af ordet opregning . Hvad er denne datatype, og hvad er den til?
Nogle gange skal en programmør oprette en ny datatype, hvis mulige værdier er begrænset til en lille fast liste.
For eksempel DayOfTheWeek
kan en type kun tage værdierne MONDAY
, TUESDAY
, WEDNESDAY
, ... Der er 7 værdier i alt. Eller en Month
type kan kun tage værdierne JANUARY
, FEBRUARY
, MARCH
, ... Der er 12 værdier i alt.
Selvfølgelig bruger du kunne tal ( int
typen): 1
— Mandag, 2
— Tirsdag osv. Men nogen kan ved et uheld tildele ugyldige værdier såsom 8
eller 0
til din variabel.
Du kunne sagtens have en situation, hvor en programmør tror, at ugedagene (eller årets måneder) er talte fra nul, mens andre forventer, at deres nummerering starter fra én osv.
Det er derfor, Java introducerede enum
, en datatype, der består af et begrænset sæt værdier .
2. Erklæring af en type
Erklæring af en ny enum
datatype ser sådan ud:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Hvor TypeName
er navnet på den nye type (klasse), og de mulige værdier er adskilt af kommaer og indpakket i krøllede klammeparenteser: Value1
, Value2
, Value3
.
Lad os som et eksempel skabe vores eget DayOfTheWeek
enum
:
Kode | Bemærk |
---|---|
|
Ny Day type Mandag Tirsdag Onsdag Torsdag Fredag Lørdag Søndag |
Sådan tildeler du en værdi til en variabel af vores nye type:
Day day = Day.MONDAY;
Eksempel:
Kode | Bemærk |
---|---|
|
Skærmoutput vil være:
|
3. Metoder til enenum
En enum
type har flere indbyggede metoder, hvoraf to er meget interessante:
Den statiske values()
metode returnerer en matrix af alle værdierne af enum
typen:
Kode | Bemærk |
---|---|
|
Variablen days gemmer et array, der indeholder værdierne af Day typen (7 elementer) Vis indholdet af arrayet på skærmen:
|
Metoden ordinal()
returnerer ordenstallet for konstanten. Du kalder det på en enum
værdi i stedet for en enum
klasse:
Kode | Konsoludgang |
---|---|
|
|
4. Konvertering til en klasse
I virkeligheden er der ikke noget magisk her. Compileren gav os lige noget syntaktisk sukker. På kompileringstidspunktet Day
konverteres enummet til en almindelig klasse:
Kode, forenklet version | Bemærk |
---|---|
|
Day klasse Liste over statiske konstanter Et array med alle værdier af Day enum En variabel, der gemmer værdien af et specifikt Day objekt Klassens er privat, hvilket betyder, at objekter i klassen Day kun kan oprettes inde i klassen. Metoden skal kaldes på et objekt. Det returnerer objektets værdi - feltet. Metoden returnerer et statisk array med alle klassens værdierconstructor Day Day ordinal Day value Day |
Hvis vi fjerner alle statiske metoder og variabler fra klassen Day
, får vi følgende:
Kode | Bemærk |
---|---|
|
Variablen value gemmer værdien af Day objektobjekterne Day kan kun oprettes inde i Day klassen, da konstruktøren er private . Metoden ordinal() returnerer value objektets Day . |
Der sker med andre ord ikke noget skræmmende her. Compileren opretter Day
klassen, tilføjer konstanterne, der repræsenterer værdierne enum
, tilføjer de nødvendige metoder og laver klassekonstruktøren private
. Vi vil se på, hvordan konstruktører arbejder lidt senere.
Forhåbentlig er det nu klart, hvorfor vi tildeler en værdi til en variabel på denne måde:
Day day = Day.MONDAY;
MONDAY
er blot et statisk felt (konstant) i Day
klassen. Når du tilgår statiske metoder og felter uden for klassen, skal du angive klassenavnet før navnet på feltet eller metoden.
5. Flere metoder til enenum
Hver enum
klasse har flere interessante funktioner.
Konvertering til og fra en streng
For at konvertere et enum-objekt til en streng, skal du kalde dets toString()
metode.
String str = Day.MONDAY.toString();
For at konvertere i den anden retning (fra en streng til et Day
objekt), kan du bruge den statiske valueOf()
metode:
Day day = Day.valueOf("MONDAY");
Det er super praktisk og vil være nyttigt i mange tilfælde.
Konvertering til et tal og tilbage igen
Du ved allerede, hvordan man konverterer et enum
objekt til et tal: Kald ordinal()
metoden:
int index = Day.MONDAY.ordinal();
For at konvertere i den anden retning (fra et tal til et Day
objekt), skal du bruge en mere gennemsigtig konstruktion:
Day day = Day.values()[2];
Eksempler:
Kode | Bemærk |
---|---|
|
Mandag Hent indekset for mandag: 0 Ugedag 2 dage efter mandag |
Vigtigt punkt: fordi enum
værdier er et fast sæt konstanter, kan de sammenlignes ved hjælp af == . Du kan med andre ord ikke have to identiske MONDAY
objekter med forskellig adresse. Der findes kun en enkelt forekomst af hver enum-værdi. Og det betyder, at sammenligning af enum-variabler ved hjælp af == altid vil fungere.
6. Tilføjelse af dine egne metoder til enenum
Fordi en enum
bliver til en almindelig klasse på kompileringstidspunktet, kan du erklære metoder i den. Disse metoder tilføjes simpelthen til den klasse, som compileren genererer. Antag for eksempel, at vi ønsker, at vi Day enum
skal returnere en liste over enum-værdierne i stedet for en matrix.
Så kan vi tilføje følgende kode:
Kode | Bemærk |
---|---|
|
Et semikolon er påkrævet efter listen over værdier. Opret et ArrayList objekt Tilføj værdierne i det array, der returneres af values() metoden. Returner listen. |
Nu kan denne metode kaldes i kode:
Kode | Bemærk |
---|---|
|
Variablen list gemmer en liste over alle værdierne af Day enum . |
GO TO FULL VERSION