2011-12-05 8 views
5

Mi enumeración es como esta actualmente:valores de las enumeraciones Configuración y análisis de cadenas para obtener una enumeración

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

Necesito crear un Hashmap por lo que planeo hacer esto, es esto correcto?

Manufacturers mfg = Manufacturers.Honda; 

mfg.ordinal() // save as key 

es decir, voy a almacenar la clave utilizando la enumInstance.ordinal()

Además, tengo que ser capaz de analizar una cadena que será el valor ordinal de la enumeración, y obtener una enumeración de vuelta:

Manufacturers mfg = Manufacturers.valueOf(mfgOrdinalValueAsString); 

Lo anterior me dio un error (la cadena era "1"). ¿Es esta la manera correcta? Supongo que debería probar/atrapar ahí ¿no?

Respuesta

2

En realidad, el .valueOf esperaría la cadena "GM" (para 1).

En cuanto a almacenar sus valores enum en un mapa, use EnumMap, que está diseñado específicamente para esto, y será rápido en eso también.

Si realmente quería hacer referencia a un valor por su ordinal, use algo como Manufacturers.values()[1].

+0

Parece que no puedo establecer el valor ordinal explícitamente, lo intenté: GM ("5"), Toyota ("6") – Blankman

+1

No, no puede configurarlos - los ordinales coincidirán con el orden en que los valores se declaran dentro de la enumeración. – ziesemer

+1

Si por alguna razón necesitas un número 'int' diferente asociado con cada elemento de la enumeración (que no sea el ordinal asignado automáticamente), siempre puedes agregarlo como un atributo a la enumeración, junto con getters –

2

Una sugerencia: utilizar mejor name() para obtener el nombre de la enumeración como String, y cada vez que se necesita para volver al original Enum de él, utilice el método valueOf() - desde valueOf() espera el nombre, no el ordinal, como un parámetro. Por ejemplo:

enum Example {ONE, TWO}; 

String name = Example.ONE.name(); 
Example e = Example.valueOf(Example.class, name); // e has value ONE 

Si definitivamente necesita utilizar el ordinal, el método ordinal() volverá un índice que se puede utilizar para recuperar la respectiva Enum de la matriz devuelta por el método values(). De esta manera:

int ordinal = Example.ONE.ordinal(); 
Example e = Example.values()[ordinal]; // e has value ONE 

Como ya se ha señalado, considerar el uso de EnumMap, como se indica en la documentación, es

Una implementación Mapa especializada para su uso con teclas de tipo de enumeración. Todas las claves en un mapa enum deben provenir de un único tipo de enumeración que se especifica, explícita o implícitamente, cuando se crea el mapa. Los mapas de Enum están representados internamente como matrices. Esta representación es extremadamente compacta y eficiente.

EDITAR

Si es necesario asociar un código diferente a cada elemento de la enumeración (que no sea su ordinal asignado automáticamente), siempre se puede añadir como un atributo de la enumeración, junto con captadores y definidores, como este:

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

} 

Por ejemplo:

Manufacturers m = Manufacturers.Honda; 
System.out.println(m.getCode()); // prints 10 
m.setCode(100); 
System.out.println(m.getCode()); // prints 100 

Solo tenga en cuenta que no podrá reconstruir un objeto Enum a partir del atributo code, ya que eso fue definido por el programador.

+0

, de modo que solo puede emitir utilizando el nombre, no el valor ordinal? – Blankman

+0

Correcto, para recuperar la enumeración usando solo el ordinal, use 'values ​​()'. Actualicé mi respuesta con ejemplos de código. –

Cuestiones relacionadas