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
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
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
Day day = Day.FRIDAY;
System.out.println(day);
De schermuitvoer zal zijn:
FRIDAY


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
Day[] days = Day.values();

for (Day day: days)
   System.out.println(day);







System.out.println(days[2]);
De daysvariabele slaat een array op met de waarden van het Daytype (7 elementen)

Toon de inhoud van de array op het scherm:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

De ordinal()methode retourneert het rangtelwoord van de constante. Je noemt het op een enumwaarde in plaats van op een enumklasse:

Code Console-uitvoer
System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.FRIDAY.ordinal());
System.out.println(Day.SUNDAY.ordinal());
0
4
6


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
public class Day
{
   public static final Day MONDAY = new Day(0);
   public static final Day TUESDAY = new Day(1);
   public static final Day WEDNESDAY = new Day(2);
   public static final Day THURSDAY = new Day(3);
   public static final Day FRIDAY = new Day(4);
   public static final Day SATURDAY = new Day(5);
   public static final Day SUNDAY = new Day(6);

    private static final Day[] array = {MONDAY, TUESDAY,
      WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};

   private final int value;

   private Day (int value)
   {
      this.value = value;
   }

   public int ordinal()
   {
      return this.value;
   }

   public static Day[] values()
   {
      return array;
   }
}
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 klasseDay

DayconstructorDayDay



ordinalDay

value


Day

Als we alle statische methoden en variabelen uit de Dayklasse verwijderen, krijgen we het volgende:

Code Opmerking
public class Day
{
  private int value;

  private Day (int value)
  {
    this.value = value;
  }

  public int ordinal()
  {
    return this.value;
  }
}


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
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
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
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY;

   public static List<Day> asList()
   {
      ArrayList<Day> list = new ArrayList<Day>();

      Collections.addAll(list, values());

      return list;
   }

}








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
List<Day> list = Day.asList();
De listvariabele slaat een lijst op met alle waarden van het Day enum.