Un consiglio: meglio usare name()
per ottenere il nome della enum come String
, e ogni volta che è necessario per ottenere indietro l'originale Enum
da esso, utilizzare il metodo valueOf()
- poiché valueOf()
aspetta il nome, non l'ordinale, come parametro. Per esempio:
enum Example {ONE, TWO};
String name = Example.ONE.name();
Example e = Example.valueOf(Example.class, name); // e has value ONE
Se è assolutamente necessario utilizzare l'ordinale, il metodo ordinal()
restituirà un indice che è possibile utilizzare per recuperare il rispettivo Enum
dalla matrice restituita dal metodo values()
. Come questo:
int ordinal = Example.ONE.ordinal();
Example e = Example.values()[ordinal]; // e has value ONE
Come è già stato sottolineato, è possibile utilizzare EnumMap
, come indicato nella documentazione, è
Un'implementazione Mappa specializzata per l'uso con chiavi tipo enum. Tutte le chiavi di una mappa enum devono provenire da un singolo tipo di enum che viene specificato, esplicitamente o implicitamente, quando viene creata la mappa. Le mappe Enum sono rappresentate internamente come array. Questa rappresentazione è estremamente compatta ed efficiente.
EDIT
Se è necessario associare un codice diverso per ogni elemento della enum (diverso dal suo ordinale assegnato automaticamente), è sempre possibile aggiungere come un attributo al enum, insieme a getter e setter, come questo:
public enum Manufacturers {
Honda(10),
GM(20),
Toyota(30),
Ferrari(40);
private int code;
Manufacturers(int code) {
this.code = code;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
Per esempio:
Manufacturers m = Manufacturers.Honda;
System.out.println(m.getCode()); // prints 10
m.setCode(100);
System.out.println(m.getCode()); // prints 100
Tieni presente che non sarai in grado di ricostruire un oggetto Enum
dall'attributo code
, poiché è stato definito dal programmatore.
Non riesco a impostare esplicitamente il valore ordinale, ho provato: GM ("5"), Toyota ("6") – Blankman
No, non è possibile impostarli - gli ordinali corrisponderanno all'ordine che il i valori sono dichiarati all'interno dell'enum. – ziesemer
Se per qualche ragione hai bisogno di un diverso numero 'int' associato ad ogni elemento dell'enum (diverso dal suo ordinale assegnato automaticamente), puoi sempre aggiungerlo come attributo all'enum, insieme ai getter –