1. Background su come enumè nato

Oggi esploreremo un altro tipo di tipo di dati in Java: enum. Il nome enumderiva dalla parola enumerazione . Cos'è questo tipo di dati e a cosa serve?

A volte un programmatore deve creare un nuovo tipo di dati, i cui valori possibili sono limitati a un piccolo elenco fisso.

Ad esempio, un DayOfTheWeektipo può assumere solo i valori MONDAY, TUESDAY, WEDNESDAY, ... Ci sono 7 valori in totale. Oppure un Monthtipo può assumere solo i valori JANUARY, FEBRUARY, MARCH, ... Ci sono 12 valori in totale.

Ovviamente, puoi usare i numeri might (il inttipo): 1— Monday, 2— Tuesday, ecc. Ma qualcuno potrebbe accidentalmente assegnare valori non validi come 8o 0alla tua variabile.

Potresti facilmente avere una situazione in cui un programmatore pensa che i giorni della settimana (o i mesi dell'anno) siano numerati a partire da zero, mentre altri si aspettano che la loro numerazione inizi da uno, ecc.

Ecco perché Java ha introdotto enum, un tipo di dati costituito da un insieme finito di valori .


2. Dichiarazione di un tipo

La dichiarazione di un nuovo enumtipo di dati è simile a questa:

enum TypeName
{
   VALUE1,
   VALUE2,
   VALUE3
}

Dove TypeNameè il nome del nuovo tipo (classe) ei possibili valori sono separati da virgole e racchiusi tra parentesi graffe: Value1, Value2, Value3.

Ad esempio, creiamo il nostro DayOfTheWeek enum:

Codice Nota
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
Nuovo Daytipo

lunedì
martedì
mercoledì
giovedì
venerdì
sabato
domenica

Ecco come assegnare un valore a una variabile del nostro nuovo tipo:

Day day = Day.MONDAY;

Esempio:

Codice Nota
Day day = Day.FRIDAY;
System.out.println(day);
L'output dello schermo sarà:
FRIDAY


3. Metodi di anenum

Un enumtipo ha diversi metodi incorporati, due dei quali sono molto interessanti:

Il values()metodo statico restituisce un array di tutti i valori del enumtipo:

Codice Nota
Day[] days = Day.values();

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







System.out.println(days[2]);
La daysvariabile memorizza un array contenente i valori del Daytipo (7 elementi)

Visualizza sullo schermo il contenuto dell'array:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

Il ordinal()metodo restituisce il numero ordinale della costante. Lo chiami su un enumvalore piuttosto che su una enumclasse:

Codice Uscita console
System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.FRIDAY.ordinal());
System.out.println(Day.SUNDAY.ordinal());
0
4
6


4. Conversione in una classe

In realtà, non c'è niente di magico qui. Il compilatore ci ha appena dato un po' di zucchero sintattico. In fase di compilazione, l' Dayenumerazione viene convertita in una classe ordinaria:

Codice, versione semplificata Nota
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

Elenco di costanti statiche







Un array con tutti i valori dell'enumerazione DayUna


variabile che memorizza il valore di un Dayoggetto specifico

La Dayclasse constructorè privata, il che significa che gli oggetti della Dayclasse possono essere creati solo all'interno della Dayclasse.



Il ordinalmetodo deve essere chiamato su un Dayoggetto.

Restituisce il valore dell'oggetto: il valuecampo.


Il metodo restituisce un array statico con tutti i valori della Dayclasse

Se rimuoviamo tutti i metodi statici e le variabili dalla Dayclasse, otteniamo quanto segue:

Codice Nota
public class Day
{
  private int value;

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

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


La valuevariabile memorizza il valore dell'oggetto Daygli

Dayoggetti possono essere creati solo all'interno della Dayclasse, poiché il costruttore è private.




Il ordinal()metodo restituisce il valuedell'oggetto Day.

In altre parole, qui non sta accadendo nulla di spaventoso. Il compilatore crea la Dayclasse, aggiunge le costanti che rappresentano i enumvalori, aggiunge i metodi necessari e crea la classe costruttore private. Vedremo come funzionano i costruttori un po 'più tardi.

Si spera che ora sia chiaro perché assegniamo un valore a una variabile in questo modo:

Day day = Day.MONDAY;

MONDAYè solo un campo statico (costante) nella Dayclasse. Quando si accede a metodi e campi statici dall'esterno della classe, è necessario indicare il nome della classe prima del nome del campo o del metodo.



5. Altri metodi di anenum

Ogni enumclasse ha diverse caratteristiche interessanti.

Conversione da e verso una stringa

Per convertire un oggetto enum in una stringa, devi chiamare il suo toString()metodo.

String str = Day.MONDAY.toString();

Per convertire nell'altra direzione (da una stringa a un Dayoggetto), puoi usare il valueOf()metodo statico:

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

È super conveniente e sarà utile in molti casi.

Conversione in un numero e viceversa

Sai già come convertire un enumoggetto in un numero: chiama il ordinal()metodo:

int index = Day.MONDAY.ordinal();

Per convertire nell'altra direzione (da un numero a un Dayoggetto), è necessario un costrutto più trasparente:

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

Esempi:

Codice Nota
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
Lunedì
Ottieni l'indice del lunedì: 0
Giorno della settimana 2 giorni dopo il lunedì

Punto importante: poiché enumi valori sono un insieme fisso di costanti, possono essere confrontati utilizzando == . In altre parole, non puoi avere due MONDAYoggetti identici con indirizzo diverso. Esiste solo una singola istanza di ogni valore enum. Ciò significa che il confronto delle variabili enum utilizzando == funzionerà sempre.



6. Aggiunta dei propri metodi a un fileenum

Poiché an enumsi trasforma in una classe ordinaria in fase di compilazione, è possibile dichiarare metodi al suo interno. Questi metodi vengono semplicemente aggiunti alla classe generata dal compilatore. Ad esempio, supponiamo di voler Day enumrestituire un elenco di valori enum piuttosto che un array.

Quindi possiamo aggiungere il seguente codice:

Codice Nota
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;
   }

}








È necessario un punto e virgola dopo l'elenco di valori.



Creare un ArrayListoggetto

Aggiungere i valori nell'array restituito dal values()metodo.
Restituisci la lista.

Ora questo metodo può essere chiamato nel codice:

Codice Nota
List<Day> list = Day.asList();
La listvariabile memorizzerà un elenco di tutti i valori del file Day enum.