1. Background su come enum
è nato
Oggi esploreremo un altro tipo di tipo di dati in Java: enum
. Il nome enum
deriva 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 DayOfTheWeek
tipo può assumere solo i valori MONDAY
, TUESDAY
, WEDNESDAY
, ... Ci sono 7 valori in totale. Oppure un Month
tipo può assumere solo i valori JANUARY
, FEBRUARY
, MARCH
, ... Ci sono 12 valori in totale.
Ovviamente, puoi usare i numeri might (il int
tipo): 1
— Monday, 2
— Tuesday, ecc. Ma qualcuno potrebbe accidentalmente assegnare valori non validi come 8
o 0
alla 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 enum
tipo 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 |
---|---|
|
Nuovo Day tipo 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 |
---|---|
|
L'output dello schermo sarà:
|
3. Metodi di anenum
Un enum
tipo ha diversi metodi incorporati, due dei quali sono molto interessanti:
Il values()
metodo statico restituisce un array di tutti i valori del enum
tipo:
Codice | Nota |
---|---|
|
La days variabile memorizza un array contenente i valori del Day tipo (7 elementi) Visualizza sullo schermo il contenuto dell'array:
|
Il ordinal()
metodo restituisce il numero ordinale della costante. Lo chiami su un enum
valore piuttosto che su una enum
classe:
Codice | Uscita console |
---|---|
|
|
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' Day
enumerazione viene convertita in una classe ordinaria:
Codice, versione semplificata | Nota |
---|---|
|
Day class Elenco di costanti statiche Un array con tutti i valori dell'enumerazione Day Una variabile che memorizza il valore di un Day oggetto specifico La Day classe constructor è privata, il che significa che gli oggetti della Day classe possono essere creati solo all'interno della Day classe. Il ordinal metodo deve essere chiamato su un Day oggetto. Restituisce il valore dell'oggetto: il value campo. Il metodo restituisce un array statico con tutti i valori della Day classe |
Se rimuoviamo tutti i metodi statici e le variabili dalla Day
classe, otteniamo quanto segue:
Codice | Nota |
---|---|
|
La value variabile memorizza il valore dell'oggetto Day gli Day oggetti possono essere creati solo all'interno della Day classe, poiché il costruttore è private . Il ordinal() metodo restituisce il value dell'oggetto Day . |
In altre parole, qui non sta accadendo nulla di spaventoso. Il compilatore crea la Day
classe, aggiunge le costanti che rappresentano i enum
valori, 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 Day
classe. 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 enum
classe 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 Day
oggetto), 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 enum
oggetto in un numero: chiama il ordinal()
metodo:
int index = Day.MONDAY.ordinal();
Per convertire nell'altra direzione (da un numero a un Day
oggetto), è necessario un costrutto più trasparente:
Day day = Day.values()[2];
Esempi:
Codice | Nota |
---|---|
|
Lunedì Ottieni l'indice del lunedì: 0 Giorno della settimana 2 giorni dopo il lunedì |
Punto importante: poiché enum
i valori sono un insieme fisso di costanti, possono essere confrontati utilizzando == . In altre parole, non puoi avere due MONDAY
oggetti 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 enum
si 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 enum
restituire un elenco di valori enum piuttosto che un array.
Quindi possiamo aggiungere il seguente codice:
Codice | Nota |
---|---|
|
È necessario un punto e virgola dopo l'elenco di valori. Creare un ArrayList oggetto Aggiungere i valori nell'array restituito dal values() metodo. Restituisci la lista. |
Ora questo metodo può essere chiamato nel codice:
Codice | Nota |
---|---|
|
La list variabile memorizzerà un elenco di tutti i valori del file Day enum . |
GO TO FULL VERSION