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
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
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
Day day = Day.FRIDAY;
System.out.println(day);
Skærmoutput vil være:
FRIDAY


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

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







System.out.println(days[2]);
Variablen daysgemmer et array, der indeholder værdierne af Daytypen (7 elementer)

Vis indholdet af arrayet på skærmen:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

Metoden ordinal()returnerer ordenstallet for konstanten. Du kalder det på en enumværdi i stedet for en enumklasse:

Kode Konsoludgang
System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.FRIDAY.ordinal());
System.out.println(Day.SUNDAY.ordinal());
0
4
6


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
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;
   }
}
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ærdierconstructorDayDay



ordinalDay

value


Day

Hvis vi fjerner alle statiske metoder og variabler fra klassen Day, får vi følgende:

Kode Bemærk
public class Day
{
  private int value;

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

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


Variablen valuegemmer værdien af Day​​objektobjekterne

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
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
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
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;
   }

}








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
List<Day> list = Day.asList();
Variablen listgemmer en liste over alle værdierne af Day enum.