2012-05-19 18 views
7

tengo enumeración como estoJava valor de enumeración personalizada es posible enumerar los

public enum Sizes { 
    Normal(232), Large(455); 

    private final int _value; 

    Sizes(int value) { 
     _value = value; 
    } 

    public int Value() { 
     return _value; 
    } 
} 

Ahora puedo llamar Sizes.Normal.Value() para obtener valor entero, pero ¿cómo puedo convertir valor entero de nuevo a la enumeración?

Lo que hago ahora es:

public Sizes ToSize(int value) { 
    for (Sizes size : Sizes.values()) { 
     if (size.Value() == value) 
      return size; 
    } 
    return null; 
} 

Pero eso es única manera de hacer eso? Así es como funciona Java?

+1

posible duplicado de [Java enum búsqueda inversa mejor práctica] (http://stackoverflow.com/questions/5316311/java-enum-reverse-look-up-best-practice) – bmargulies

Respuesta

8

Sí, así es como se hace, generalmente agregando un método estático a la enumeración. Piénsalo; podrías tener 10 campos en la enumeración. ¿Esperas que Java configure las búsquedas para todos ellos?

El punto aquí es que las enumeraciones de Java no tienen un 'valor'. Tienen identidad y un ordinal, más lo que sea que agregues para ti. Esto es simplemente diferente de C#, que sigue a C++ al tener un valor entero arbitrario en su lugar.

+2

Traté de poner una estática HashMap en su enumeración, pero parece que no está permitido llenarlo desde dentro del constructor enum. 1+ –

+0

Bueno, yo todavía prefiero cómo maneja C# enums. Es mucho más rápido. Enum supone que es un identificador entero, no toda la clase :) – xmen

+0

Es posible que deba inicializarlo en un bloque estático. static HashMap privado map = new HashMap ; y luego pone en el ctor? – bmargulies

1

Ha pasado un tiempo desde la última vez que trabajé con Java, pero si recuerdo correctamente, no hay relación entre el campo _value y el ordinal de la enumeración. AFAIK podría tener dos entradas con el mismo _value, por ejemplo. Como señaló @bmargulies, podría tener muchos campos en la enumeración, y nada lo obliga a usar valores distintos para cada uno (o todos) de ellos.

Véase también this related question. Aparentemente, no puede establecer directamente el ordinal de sus entradas.

+0

por eso pregunté, estaba pensando que podría haber soporte integrado en Java como C#, pero tengo que escribir todo. Es como trabajar en C++ lol – xmen

Cuestiones relacionadas