Tengo el tipo de enumeración ReportTypeEnum
que se pasa entre los métodos en todas mis clases, pero luego necesito pasar esto en la URL, así que uso el método ordinal para obtener el valor int. Después de obtenerlo en mi otra página JSP, necesito convertirlo de nuevo a un ReportTypeEnum
para poder continuar pasándolo.
¿Cómo puedo convertir ordinal a la ReportTypeEnum
?
Usando Java 6 SE.
Respuestas:
Para convertir un ordinal en su representación enum, es posible que desee hacer esto:
Tenga en cuenta los límites de la matriz.
Tenga en cuenta que cada llamada a
values()
devuelve una matriz recién clonada que podría afectar el rendimiento de manera negativa. Es posible que desee almacenar en caché la matriz si se va a llamar con frecuencia.Ejemplo de código sobre cómo almacenar en caché
values()
.Esta respuesta fue editada para incluir la retroalimentación dada dentro de los comentarios
fuente
Es casi seguro que sea una mala idea . Ciertamente, si el ordinal es de facto persistente (por ejemplo, porque alguien ha marcado la URL), significa que siempre debe preservar el
enum
orden en el futuro, lo que puede no ser obvio para los mantenedores de código en el futuro.¿Por qué no codificar el
enum
usomyEnumValue.name()
(y decodificar medianteReportTypeEnum.valueOf(s)
) en su lugar?fuente
value
inicio o su posición alfabética / lógica correcta. (Por lógico quiero decir, por ejemplo, losTimeUnit
valores tienen una posición lógica)Si voy a usar
values()
mucho:Mientras tanto donde sea.java:
Cuida los límites de tu matriz.
fuente
Suit.values[0] = Suit.Diamonds;
en algún lugar de su código. Idealmente, eso nunca sucederá, pero el principio general de no exponer campos mutables aún se mantiene. Para este enfoque, considere usar en su lugarCollections.unmodifiableList
o similares.Suit values[]
directa o indirectamente (cómo se mencionógetValues()
), trabajo con un método público donde elordinal
valor debe enviarse como un argumento y devolver laSuit
representaciónSuit values[]
. El punto aquí (el mosaico de la pregunta desde el principio) fue crear un tipo de enumeración a partir de un enum ordinalEstoy de acuerdo con la mayoría de las personas en que usar ordinal es probablemente una mala idea. Por lo general, resuelvo este problema dándole a la enumeración un constructor privado que puede tomar, por ejemplo, un valor DB y luego crear una
fromDbValue
función estática similar a la de la respuesta de Jan.Ahora puede cambiar el orden sin cambiar la búsqueda y viceversa.
fuente
Usted podría utilizar una tabla de consulta estática:
fuente
0...(n-1)
, entonces una matriz tiene menos código y también es más legible; El aumento de rendimiento es solo una ventaja.private static final Suit[] VALUES = values();
ypublic Suit fromOrdinal(int ordinal) { return VALUES[ordinal]; }
. Ventaja adicional: se bloquea inmediatamente en ordinales no válidos, en lugar de devolver silenciosamente nulo. (No siempre es una ventaja. Pero a menudo.)Esto es lo que yo uso. No pretendo que sea mucho menos "eficiente" que las soluciones más simples anteriores. Lo que hace es proporcionar un mensaje de excepción mucho más claro que "ArrayIndexOutOfBounds" cuando se utiliza un valor ordinal no válido en la solución anterior.
Utiliza el hecho de que EnumSet javadoc especifica que el iterador devuelve elementos en su orden natural. Hay una afirmación si eso no es correcto.
La prueba JUnit4 demuestra cómo se usa.
fuente
Esto es lo que hago en Android con Proguard:
es breve y no necesito preocuparme por tener una excepción en Proguard
fuente
Puede definir un método simple como:
Y úsalo como:
fuente
la clase de prueba
Le agradezco que comparta con nosotros si tiene un código más eficiente. Mi enumeración es enorme y se llama constantemente miles de veces.
fuente
Entonces, una forma es hacer lo
ExampleEnum valueOfOrdinal = ExampleEnum.values()[ordinal];
que funciona y es fácil, sin embargo, como se mencionó anteriormente,ExampleEnum.values()
devuelve una nueva matriz clonada para cada llamada. Eso puede ser innecesariamente costoso. Podemos resolver eso almacenando en caché la matriz de esta maneraExampleEnum[] values = values()
. También es "peligroso" permitir que se modifique nuestra matriz en caché. Alguien podría escribir,ExampleEnum.values[0] = ExampleEnum.type2;
así que lo haría privado con un método de acceso que no haga copias adicionales.Utilizaría
ExampleEnum.value(ordinal)
para obtener el valor de enumeración asociado conordinal
fuente
Cada enumeración tiene nombre (), que proporciona una cadena con el nombre del miembro enumeración.
Dado
enum Suit{Heart, Spade, Club, Diamond}
,Suit.Heart.name()
daráHeart
.Cada enumeración tiene un
valueOf()
método, que toma un tipo de enumeración y una cadena, para realizar la operación inversa:Enum.valueOf(Suit.class, "Heart")
vuelveSuit.Heart
.Por qué alguien usaría ordinales está más allá de mí. Puede ser nanosegundos más rápido, pero no es seguro, si los miembros de la enumeración cambian, ya que otro desarrollador puede no ser consciente de que algún código se basa en valores ordinales (especialmente en la página JSP citada en la pregunta, la sobrecarga de la red y la base de datos domina por completo el tiempo, no usar un entero sobre una cadena).
fuente