1. Baggrund for hvordan enumblev til
I dag vil vi udforske en anden slags datatype i Java: enum. Navnet enumkommer 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 DayOfTheWeekkan en type kun tage værdierne MONDAY, TUESDAY, WEDNESDAY, ... Der er 7 værdier i alt. Eller en Monthtype kan kun tage værdierne JANUARY, FEBRUARY, MARCH, ... Der er 12 værdier i alt.
Selvfølgelig bruger du kunne tal ( inttypen): 1— Mandag, 2— Tirsdag osv. Men nogen kan ved et uheld tildele ugyldige værdier såsom 8eller 0til 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 enumdatatype ser sådan ud:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Hvor TypeNameer 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 Daytype 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 enumtype har flere indbyggede metoder, hvoraf to er meget interessante:
Den statiske values()metode returnerer en matrix af alle værdierne af enumtypen:
| Kode | Bemærk |
|---|---|
|
Variablen daysgemmer et array, der indeholder værdierne af Daytypen (7 elementer) Vis indholdet af arrayet på skærmen: |
Metoden ordinal()returnerer ordenstallet for konstanten. Du kalder det på en enumværdi i stedet for en enumklasse:
| Kode | Konsoludgang |
|---|---|
|
|
4. Konvertering til en klasse
I virkeligheden er der ikke noget magisk her. Compileren gav os lige noget syntaktisk sukker. På kompileringstidspunktet Daykonverteres enummet til en almindelig klasse:
| Kode, forenklet version | Bemærk |
|---|---|
|
Dayklasse Liste over statiske konstanter Et array med alle værdier af Dayenum En variabel, der gemmer værdien af et specifikt Dayobjekt Klassens er privat, hvilket betyder, at objekter i klassen Daykun 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ærdierconstructorDayDayordinalDayvalueDay |
Hvis vi fjerner alle statiske metoder og variabler fra klassen Day, får vi følgende:
| Kode | Bemærk |
|---|---|
|
Variablen valuegemmer værdien af Dayobjektobjekterne Daykan kun oprettes inde i Dayklassen, da konstruktøren er private. Metoden ordinal()returnerer valueobjektets Day. |
Der sker med andre ord ikke noget skræmmende her. Compileren opretter Dayklassen, 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;
MONDAYer blot et statisk felt (konstant) i Dayklassen. 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 enumklasse 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 Dayobjekt), 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 enumobjekt til et tal: Kald ordinal()metoden:
int index = Day.MONDAY.ordinal();
For at konvertere i den anden retning (fra et tal til et Dayobjekt), 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 enumværdier er et fast sæt konstanter, kan de sammenlignes ved hjælp af == . Du kan med andre ord ikke have to identiske MONDAYobjekter 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 enumbliver 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 enumskal 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 ArrayListobjekt 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 listgemmer en liste over alle værdierne af Day enum. |
GO TO FULL VERSION