2011-12-05 3 views
5

mio enum è come questo momento:Impostazione dei valori di enumerazioni, e l'analisi di stringa per ottenere un enum

public enum Manufacturers { 
    Honda, 
    GM, 
    Toyota, 
    Ferrari 
} 

Ho bisogno di creare un HashMap così ho intenzione di fare questo, è corretto?

Manufacturers mfg = Manufacturers.Honda; 

mfg.ordinal() // save as key 

cioè io memorizzare la chiave utilizzando il enumInstance.ordinal()

Inoltre, ho bisogno di essere in grado di analizzare una stringa che sarà il valore ordinale dell'enumerazione, e ottenere un enum indietro:

Manufacturers mfg = Manufacturers.valueOf(mfgOrdinalValueAsString); 

Quanto sopra mi ha dato un errore (la stringa era "1"). È questo il modo corretto? Credo che dovrei provare/catturare lì, giusto?

risposta

2

Lo .valueOf in realtà si aspetta la stringa "GM" (per 1).

Per quanto riguarda la memorizzazione dei valori enum in una mappa, utilizzare EnumMap che è stato progettato specificamente per questo - e sarà veloce anche a questo.

Se si desidera veramente fare riferimento a un valore tramite il suo ordinale, utilizzare qualcosa come Manufacturers.values()[1].

+0

Non riesco a impostare esplicitamente il valore ordinale, ho provato: GM ("5"), Toyota ("6") – Blankman

+1

No, non è possibile impostarli - gli ordinali corrisponderanno all'ordine che il i valori sono dichiarati all'interno dell'enum. – ziesemer

+1

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 –

2

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.

+0

in modo che tu possa trasmettere solo usando il nome, non il valore ordinale? – Blankman

+0

Esatto, per recuperare l'enumerazione usando solo l'ordinale, usare 'values ​​()'. Ho aggiornato la mia risposta con esempi di codice. –