2011-11-16 33 views
177

Tengo una función que devuelve un tipo int. Sin embargo, solo tengo un valor de la enumeración TAX.Cómo convertir el valor enum a int?

¿Cómo puedo convertir el valor de la enumeración de TAX en un int?

public enum TAX { 
    NOTAX(0),SALESTAX(10),IMPORTEDTAX(5); 

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

TAX var = TAX.NOTAX; // This value will differ 

public int getTaxValue() 
{ 
    // what do do here? 
    // return (int)var; 
} 
+1

duplicado posible de [Cómo hacer coincidir int para enumeración] (http://stackoverflow.com/questions/7996335/how-to-match-int-to-enum) – malat

Respuesta

273

Se necesitaría para hacer la enumeración exponer value alguna manera, por ejemplo,

public enum Tax { 
    NONE(0), SALES(10), IMPORT(5); 

    private final int value; 
    private Tax(int value) { 
     this.value = value; 
    } 

    public int getValue() { 
     return value; 
    } 
} 

... 

public int getTaxValue() { 
    Tax tax = Tax.NONE; // Or whatever 
    return tax.getValue(); 
} 

(he cambiado los nombres a ser un poco más convencional y fácil de leer, por cierto.)

Esto es asumiendo desea que el valor asignado en el constructor. Si eso no es lo que quieres, tendrás que darnos más información.

+11

hay una idea mejor aquí http://stackoverflow.com/a/7996473/398348 – likejiujitsu

+0

@likejiujitsu: Eso va en la dirección opuesta. En esta pregunta, el OP ya * tiene * un valor de tipo 'Impuesto', y quiere obtener el valor numérico de él. –

+0

Acabo de probarlo y me doy cuenta de que falla 'myEnumValue = MyEnum.valueOf (myInt);' el argumento tiene que ser del tipo String - o hay algo que me falta? – likejiujitsu

16

Si desea el valor que está asignando en el constructor, necesita agregar un método en la definición enum para devolver ese valor.

Si desea un número único que represente el valor enum, puede usar ordinal().

+2

Ten cuidado. Hay muchos más patrones de desarrollo que se basan en 'ordinal()' que los casos de uso válidos para 'ordinal()'. Si necesita almacenar un valor único para el 'enum', simplemente almacene el' enum'. Hay EnumSets, listas de enumeraciones, EnumMaps y casi cualquier otra colección de Enum que pueda desear. –

+1

@EdwinBuck: Eso es bueno para señalar, solo quería mencionar la existencia de 'ordinal()' porque el OP no dejaba en claro lo que quería que fuera realmente el int. – unholysampler

+0

No obtener ordinal. Por favor revisa la enum api con respecto a esto. Up-vote eliminado. –

161

Yo prefiero esta:

public enum Color { 

    White, 

    Green, 

    Blue, 

    Purple, 

    Orange, 

    Red 
} 

a continuación:

//cast enum to int 
int color = Color.Blue.ordinal(); 
+27

Esto es incorrecto/no recomendado por Joshua Bloch en su libro Effective Java (2nd ed). Vea el ítem 31. – user504342

+1

No se recomienda usar el método ordinal() directamente. – tonga

+25

@ user504342 No tengo la segunda edición del libro, ¿podría darnos la esencia de por qué no se recomienda? – likejiujitsu

6

En algún momento alguna C# enfoque hace que la vida más fácil en el mundo Java ..:

class XLINK { 
static final short PAYLOAD = 102, ACK = 103, PAYLOAD_AND_ACK = 104; 
} 
//Now is trivial to use it like a C# enum: 
int rcv = XLINK.ACK; 
+0

Para mí, esta es la forma más conveniente de ir. Obtengo los beneficios de enum (claridad de código), un tipo de datos que es amigable para DB, y no tengo que buscar 100 alternativas de enum para hacerlo a "manera de Android". Simple y efectivo. –

1

Tal vez es mejor utilizar una representación de cadena que un entero, porque la cadena sigue siendo válida si los valores se agregan a la enumeración. Puede usar el método de nombre() de enum para convertir el valor enum a un método String an the valueum de (enum) para crear una representación enum de String nuevamente. El siguiente ejemplo muestra cómo convertir el valor de enumeración de cadena y de vuelta (ValueType es una enumeración):

ValueType expected = ValueType.FLOAT; 
String value = expected.name(); 

System.out.println("Name value: " + value); 

ValueType actual = ValueType.valueOf(value); 

if(expected.equals(actual)) System.out.println("Values are equal");