1. Achtergrondinformatie over hoe het enumis ontstaan
Vandaag zullen we een ander soort gegevenstype in Java onderzoeken: enum. De naam enumkomt 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 , , , ... DayOfTheWeekaannemen. Er zijn in totaal 7 waarden. Of een type kan alleen de waarden , , , ... aannemen Er zijn in totaal 12 waarden.MONDAYTUESDAYWEDNESDAYMonthJANUARYFEBRUARYMARCH
U kunt natuurlijk getallen gebruiken (van het inttype): 1— Maandag, 2— Dinsdag, enz. Maar iemand kan per ongeluk ongeldige waarden toewijzen, zoals 8of 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 enumgegevenstype ziet er als volgt uit:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Waar TypeNameis 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 Daytype 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 enumtype heeft verschillende ingebouwde methoden, waarvan er twee erg interessant zijn:
De statische values()methode retourneert een array van alle waarden van het enumtype:
| Code | Opmerking |
|---|---|
|
De daysvariabele slaat een array op met de waarden van het Daytype (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 enumwaarde in plaats van op een enumklasse:
| 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 Daywordt de enum geconverteerd naar een gewone klasse:
| Code, vereenvoudigde versie | Opmerking |
|---|---|
|
Dayclass Lijst met statische constanten Een array met alle waarden van de Dayenum 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 DayDayconstructorDayDayordinalDayvalueDay |
Als we alle statische methoden en variabelen uit de Dayklasse verwijderen, krijgen we het volgende:
| Code | Opmerking |
|---|---|
|
De valuevariabele slaat de waarde van het Dayobject op. DayObjecten kunnen alleen binnen de Dayklasse worden gemaakt, aangezien de constructor private. De ordinal()methode retourneert de valuewaarde van het Dayobject. |
Met andere woorden, hier gebeurt niets engs. De compiler maakt de Dayklasse, voegt de constanten toe die de enumwaarden 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;
MONDAYis gewoon een statisch veld (constant) in de Dayklas. 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 enumklasse 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 Dayobject), 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 Dayobject), 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 enumwaarden een vaste set constanten zijn, kunnen ze worden vergeleken met == . Met andere woorden, u kunt geen twee identieke MONDAYobjecten 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 enumtijdens 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 enumeen 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 ArrayListobject 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 listvariabele slaat een lijst op met alle waarden van het Day enum. |
GO TO FULL VERSION