1. Bakgrunn for hvordan enumble til

I dag skal vi utforske en annen type datatype i Java: enum. Navnet enumkommer fra ordet oppregning . Hva er denne datatypen og hva er den for?

Noen ganger må en programmerer opprette en ny datatype, hvis mulige verdier er begrenset til en liten fast liste.

For eksempel DayOfTheWeekkan en type bare ta verdiene MONDAY, TUESDAY, WEDNESDAY, ... Det er 7 verdier totalt. Eller en Monthtype kan bare ta verdiene JANUARY, FEBRUARY, MARCH, ... Det er totalt 12 verdier.

Selvfølgelig bruker du kunne tall ( inttypen): 1— Mandag, 2— Tirsdag, osv. Men noen kan ved et uhell tildele ugyldige verdier som 8eller 0til variabelen din.

Du kan lett ha en situasjon der en programmerer tror ukedagene (eller månedene i året) er nummererte fra null, mens andre forventer at nummereringen deres starter fra én osv.

Det er derfor Java introduserte enum, en datatype som består av et begrenset sett med verdier .


2. Erklære en type

Å erklære en ny enumdatatype ser slik ut:

enum TypeName
{
   VALUE1,
   VALUE2,
   VALUE3
}

Hvor TypeNameer navnet på den nye typen (klassen), og de mulige verdiene er atskilt med komma og pakket inn i krøllete klammeparenteser: Value1, Value2, Value3.

Som et eksempel, la oss lage vår egen DayOfTheWeek enum:

Kode Merk
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
Ny Daytype

mandag
tirsdag
onsdag torsdag
fredag
​​lørdag
søndag

Slik tildeler du en verdi til en variabel av vår nye type:

Day day = Day.MONDAY;

Eksempel:

Kode Merk
Day day = Day.FRIDAY;
System.out.println(day);
Skjermutgangen vil være:
FRIDAY


3. Metoder for enenum

En enumtype har flere innebygde metoder, hvorav to er veldig interessante:

Den statiske values()metoden returnerer en matrise med alle verdiene av enumtypen:

Kode Merk
Day[] days = Day.values();

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







System.out.println(days[2]);
Variabelen dayslagrer en matrise som inneholder verdiene av Daytypen (7 elementer)

Vis innholdet i matrisen på skjermen:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

Metoden ordinal()returnerer ordenstallet til konstanten. Du kaller det på en enumverdi i stedet for en enumklasse:

Kode Konsollutgang
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 virkeligheten er det ikke noe magisk her. Kompilatoren ga oss bare litt syntaktisk sukker. Ved kompilering Dayblir enumet konvertert til en vanlig klasse:

Kode, forenklet versjon Merk
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







En matrise med alle verdiene av Dayenum


En variabel som lagrer verdien til et spesifikt Dayobjekt

Klassens er privat, noe som betyr at objekter i Dayklassen kun kan opprettes inne i klassen. Metoden må kalles på et objekt. Den returnerer objektets verdi - feltet. Metoden returnerer en statisk matrise med alle verdiene til klassenconstructorDayDay



ordinalDay

value


Day

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

Kode Merk
public class Day
{
  private int value;

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

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


Variabelen valuelagrer verdien av Dayobjektobjektene

Daykan bare opprettes inne i Dayklassen, siden konstruktøren er private.




Metoden ordinal()returnerer til valueobjektet Day.

Det skjer med andre ord ikke noe skummelt her. Kompilatoren oppretter Dayklassen, legger til konstantene som representerer verdiene enum, legger til de nødvendige metodene og lager klassekonstruktøren private. Vi skal se på hvordan konstruktører jobber litt senere.

Forhåpentligvis er det nå klart hvorfor vi tildeler en verdi til en variabel på denne måten:

Day day = Day.MONDAY;

MONDAYer bare et statisk felt (konstant) i Dayklassen. Når du får tilgang til statiske metoder og felt utenfor klassen, må du angi klassenavnet før navnet på feltet eller metoden.



5. Flere metoder for enenum

Hver enumklasse har flere interessante funksjoner.

Konvertering til og fra en streng

For å konvertere et enum-objekt til en streng, må du kalle metoden toString().

String str = Day.MONDAY.toString();

For å konvertere i den andre retningen (fra en streng til et Dayobjekt), kan du bruke den statiske valueOf()metoden:

Day day = Day.valueOf("MONDAY");

Det er super praktisk og vil være nyttig i mange tilfeller.

Konverterer til et tall og tilbake igjen

Du vet allerede hvordan du konverterer et enumobjekt til et tall: ring ordinal()metoden:

int index = Day.MONDAY.ordinal();

For å konvertere i den andre retningen (fra et tall til et Dayobjekt), trenger du en mer gjennomsiktig konstruksjon:

Day day = Day.values()[2];

Eksempler:

Kode Merk
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
Mandag
Få indeksen for mandag: 0
Ukedag 2 dager etter mandag

Viktig poeng: fordi enumverdier er et fast sett med konstanter, kan de sammenlignes med == . Du kan med andre ord ikke ha to identiske MONDAYobjekter med forskjellig adresse. Bare en enkelt forekomst av hver enum-verdi eksisterer. Og det betyr at sammenligning av enum-variabler med == alltid vil fungere.



6. Legge til dine egne metoder til enenum

Fordi en enumblir til en vanlig klasse ved kompilering, kan du deklarere metoder i den. Disse metodene legges ganske enkelt til klassen som kompilatoren genererer. Anta for eksempel at vi vil at vi Day enumskal returnere en liste over enum-verdiene i stedet for en matrise.

Deretter kan vi legge til følgende kode:

Kode Merk
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 kreves etter listen over verdier.



Lag et ArrayListobjekt

Legg til verdiene i matrisen som returneres av values()metoden.
Returner listen.

Nå kan denne metoden kalles i kode:

Kode Merk
List<Day> list = Day.asList();
Variabelen listvil lagre en liste over alle verdiene til Day enum.