1. Achtergrondinformatie over hoe het enum
is ontstaan
Vandaag zullen we een ander soort gegevenstype in Java onderzoeken: enum
. De naam enum
komt van het woord opsomming . Wat is dit gegevenstype en waar dient het voor?
Soms moet een programmeur een nieuw gegevenstype maken, waarvan de mogelijke waarden beperkt zijn tot een kleine vaste lijst.
Een type kan bijvoorbeeld alleen de waarden , , , ... DayOfTheWeek
aannemen. Er zijn in totaal 7 waarden. Of een type kan alleen de waarden , , , ... aannemen Er zijn in totaal 12 waarden.MONDAY
TUESDAY
WEDNESDAY
Month
JANUARY
FEBRUARY
MARCH
U kunt natuurlijk getallen gebruiken (van het int
type): 1
— Maandag, 2
— Dinsdag, enz. Maar iemand kan per ongeluk ongeldige waarden toewijzen, zoals 8
of 0
, aan uw variabele.
Je zou gemakkelijk een situatie kunnen hebben waarin een programmeur denkt dat de dagen van de week (of maanden van het jaar) beginnen met nul, terwijl anderen verwachten dat hun nummering begint met één, enz.
Daarom introduceerde Java enum
, een gegevenstype dat uit een eindige reeks waarden bestaat .
2. Een type declareren
Het declareren van een nieuw enum
gegevenstype ziet er als volgt uit:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Waar TypeName
is de naam van het nieuwe type (klasse), en de mogelijke waarden worden gescheiden door komma's en tussen accolades geplaatst: Value1
, Value2
, Value3
.
Laten we als voorbeeld onze eigen maken DayOfTheWeek
enum
:
Code | Opmerking |
---|---|
|
Nieuw Day type Maandag Dinsdag Woensdag Donderdag Vrijdag Zaterdag Zondag |
Zo kent u een waarde toe aan een variabele van ons nieuwe type:
Day day = Day.MONDAY;
Voorbeeld:
Code | Opmerking |
---|---|
|
De schermuitvoer zal zijn:
|
3. Methoden van eenenum
Een enum
type heeft verschillende ingebouwde methoden, waarvan er twee erg interessant zijn:
De statische values()
methode retourneert een array van alle waarden van het enum
type:
Code | Opmerking |
---|---|
|
De days variabele slaat een array op met de waarden van het Day type (7 elementen) Toon de inhoud van de array op het scherm:
|
De ordinal()
methode retourneert het rangtelwoord van de constante. Je noemt het op een enum
waarde in plaats van op een enum
klasse:
Code | Console-uitvoer |
---|---|
|
|
4. Omzetten naar een klas
In werkelijkheid is hier niets magisch. De compiler heeft ons net wat syntactische suiker gegeven. Tijdens het compileren Day
wordt de enum geconverteerd naar een gewone klasse:
Code, vereenvoudigde versie | Opmerking |
---|---|
|
Day class Lijst met statische constanten Een array met alle waarden van de Day enum Een variabele die de waarde van een specifiek object opslaat De klasse is privé, wat betekent dat objecten van de klasse alleen binnen de klasse kunnen worden gemaakt . De methode moet worden aangeroepen op een object. Het retourneert de waarde van het object - het veld. De methode retourneert een statische array met alle waarden van de klasse Day Day constructor Day Day ordinal Day value Day |
Als we alle statische methoden en variabelen uit de Day
klasse verwijderen, krijgen we het volgende:
Code | Opmerking |
---|---|
|
De value variabele slaat de waarde van het Day object op. Day Objecten kunnen alleen binnen de Day klasse worden gemaakt, aangezien de constructor private . De ordinal() methode retourneert de value waarde van het Day object. |
Met andere woorden, hier gebeurt niets engs. De compiler maakt de Day
klasse, voegt de constanten toe die de enum
waarden vertegenwoordigen, voegt de benodigde methoden toe en maakt de klassenconstructor private
. We zullen later bekijken hoe constructors werken.
Hopelijk is het nu duidelijk waarom we op deze manier een waarde toekennen aan een variabele:
Day day = Day.MONDAY;
MONDAY
is gewoon een statisch veld (constant) in de Day
klas. Wanneer u statische methoden en velden van buiten de klasse benadert, moet u de klassenaam vóór de naam van het veld of de methode aangeven.
5. Meer methoden van eenenum
Elke enum
klasse heeft verschillende interessante kenmerken.
Converteren van en naar een string
Om een enum-object naar een string te converteren, moet je de methode ervan aanroepen toString()
.
String str = Day.MONDAY.toString();
Om in de andere richting te converteren (van een string naar een Day
object), kunt u de statische valueOf()
methode gebruiken:
Day day = Day.valueOf("MONDAY");
Het is superhandig en zal in veel gevallen nuttig zijn.
Omrekenen naar een getal en weer terug
Je weet al hoe je een object naar een getal converteert enum
: noem de ordinal()
methode:
int index = Day.MONDAY.ordinal();
Om in de andere richting te converteren (van een getal naar een Day
object), heb je een meer transparante constructie nodig:
Day day = Day.values()[2];
Voorbeelden:
Code | Opmerking |
---|---|
|
Maandag Haal de index van maandag op: 0 Dag van de week 2 dagen na maandag |
Belangrijk punt: omdat enum
waarden een vaste set constanten zijn, kunnen ze worden vergeleken met == . Met andere woorden, u kunt geen twee identieke MONDAY
objecten met een verschillend adres hebben. Er bestaat slechts één instantie van elke opsommingswaarde. En dat betekent dat het vergelijken van enum-variabelen met behulp van == altijd zal werken.
6. Uw eigen methoden toevoegen aan eenenum
Omdat een enum
tijdens het compileren in een gewone klasse verandert, kun je er methoden in declareren. Deze methoden worden simpelweg toegevoegd aan de klasse die de compiler genereert. Stel dat we willen dat onze Day enum
een lijst met de opsommingswaarden retourneert in plaats van een matrix.
Dan kunnen we de volgende code toevoegen:
Code | Opmerking |
---|---|
|
Na de lijst met waarden is een puntkomma vereist. Maak een ArrayList object Voeg de waarden toe in de array die door de values() methode wordt geretourneerd. Geef de lijst terug. |
Nu kan deze methode in code worden aangeroepen:
Code | Opmerking |
---|---|
|
De list variabele slaat een lijst op met alle waarden van het Day enum . |
GO TO FULL VERSION