Digamos que tengo una enumeración que es solo
public enum Blah {
A, B, C, D
}
y me gustaría encontrar el valor de enumeración de una cadena, por ejemplo, "A"
cuál sería Blah.A
. ¿Cómo sería posible hacer esto?
¿Es el Enum.valueOf()
método que necesito? Si es así, ¿cómo usaría esto?
Blah.valueOf("A")
método distingue entre mayúsculas y minúsculas y no tolera espacios en blanco extraños, por lo tanto, la solución alternativa propuesta a continuación por @ JoséMi.toString()
valor, no, no diría eso.name()
obtendrá el nombre real definido de la constante enum a menos que lo anule.enum Blah {...}
definición real no debería tratar de declarar su propiavalues
nivaluesOf
. Es como cómo puedes escribir "AnyTypeName.class" aunque nunca hayas declarado una variable miembro de "clase"; El compilador hace que todo funcione. (Es posible que esta respuesta ya no le sea útil 3 meses después, pero por si acaso.)Otra solución si el texto no es igual al valor de enumeración:
fuente
throw new IllegalArgumentException("No constant with text " + text + " found")
sería mejor quereturn null
.Aquí hay una ingeniosa utilidad que uso:
Luego, en mi clase de enumeración, generalmente tengo esto para guardar algo de escritura:
Si sus enumeraciones no son todas mayúsculas, simplemente cambie la
Enum.valueOf
línea.Es una lástima que no puedo utilizar
T.class
paraEnum.valueOf
queT
se borra.fuente
Use el patrón de Joshua Bloch, Java efectivo :
(simplificado por brevedad)
Ver también:
Ejemplo de Oracle Java con Enum y Map de instancias
Orden de ejecución de bloques estáticos en un tipo Enum
¿Cómo puedo buscar una enumeración de Java a partir de su valor de cadena
fuente
Stream.of(MyEnum.values()).collect(toMap(Enum::name, identity()))
también recomiendo reemplazar toString () (pasado a través del constructor) y usarlo en lugar de nombre, especialmente si Enum está asociado con datos serializables, ya que esto le permite controlar la carcasa sin dar Sonar un ajuste.unmodifiableMap
todos modos, entonces no hay ningún beneficio en comenzar con unConcurrentHashMap
. Solo usa aHashMap
. (Si tienes guayaba,ImmutableMap
¡te lo recomendaría!)ConcurrentHashMap
aquí, donde el mapa nunca se modifica después de la inicialización. De ahí por qué incluso, por ejemplo, el ejemplo en el JLS en sí usa un regularHashMap
.También debe tener cuidado con su caso. Déjame explicarte: hacer
Blah.valueOf("A")
trabajos, peroBlah.valueOf("a")
no funcionará. Entonces otra vezBlah.valueOf("a".toUpperCase(Locale.ENGLISH))
funcionaría.editar
Cambiado
toUpperCase
atoUpperCase(Locale.ENGLISH)
basado en tc. comentario y los documentos de Javaedit2 En Android deberías usar
Locale.US
, como señala sulai .fuente
Locale.US
entradas / salidas legibles por máquina.Aquí hay un método que puede hacerlo para cualquier Enum, y no distingue entre mayúsculas y minúsculas.
fuente
equalsIgnoreCase
es el camino a seguir. +1Usar
Blah.valueOf(string)
es lo mejor, pero también puedes usarloEnum.valueOf(Blah.class, string)
.fuente
En Java 8 o posterior, usando Streams :
fuente
Si no desea escribir su propia utilidad, use Google guayaba biblioteca:
A diferencia de la función Java incorporada, le permite verificar si A está presente en Blah y no arroja una excepción.
fuente
Mis 2 centavos aquí: usar Java8 Streams + verificar una cadena exacta:
** EDITAR **
Cambió el nombre de la función a,
fromString()
ya que al nombrarla usando esa convención, obtendrá algunos beneficios del lenguaje Java; por ejemplo:fuente
switch
bloques legibles , puede.orElse(null)
hacerlo en lugar de.orElseThrow()
para poder codificar la excepcióndefault
, incluir la cláusula e incluir más información útil cuando sea necesario. Y para hacerlo más indulgente, podrías usarlov -> Objects.equals(v.name, s == null ? "" : s.trim().toUpperCase())
Optional
defindFirst()
, permitiendo al usuario decidir si quiere.orElse(null)
,orElseThrow()
o lo que sea ...public static MyEnum valueOf(String)
es en realidad un error de compilación, ya que es el mismo que el definido implícitamente, por lo que la versión anterior de su respuesta es realmente mejor. ( jls , ideone )Es posible que necesite esto:
Una adición más:
Esto le devolverá el Valor por un Nombre de Enum. Stringified. Por ejemplo, si proporciona "PERSONA" en fromEnumName, le devolverá el Valor de Enum, es decir, "Persona"
fuente
Otra forma de hacerlo mediante el método estático implícito
name()
de Enum. name devolverá la cadena exacta utilizada para crear esa enumeración que se puede utilizar para verificar la cadena proporcionada:Pruebas:
System.out.println(Blah.getEnum("B").name());
inspiración: 10 ejemplos de Enum en Java
fuente
valueOf
hace por ti. Este método estático no ofrece nada extra, excepción y todo. Entonces las construcciones if / else son altamente peligrosas ... cualquier nueva constante enum agregada hará que este método se rompa sin cambios.name()
No es estático.Solución utilizando bibliotecas de guayaba. El método getPlanet () no distingue entre mayúsculas y minúsculas, por lo que getPlanet ("MerCUrY") devolverá Planet.MERCURY.
fuente
Para agregar a las respuestas anteriores y abordar algunas de las discusiones sobre nulos y NPE, estoy usando Guava Optionals para manejar casos ausentes / inválidos. Esto funciona muy bien para el análisis de URI / parámetros.
Para aquellos que no lo saben, aquí hay más información sobre cómo evitar nulos con Opcional: https://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained#Optional
fuente
En Java 8, el patrón de Mapa estático es aún más fácil y es mi método preferido. Si desea usar Enum con Jackson, puede anular toString y usar eso en lugar de nombre, luego anotar con
@JsonValue
fuente
fuente
Método O (1) inspirado en el código generado por ahorro que utiliza un hashmap.
fuente
Enum es muy útil, he estado usando
Enum
mucho para agregar una descripción para algunos campos en diferentes idiomas, como el siguiente ejemplo:Y luego puede recuperar la descripción dinámicamente en función del código de idioma pasado al
getDescription(String lang)
método, por ejemplo:fuente
¿Qué pasa?
fuente
java.lang.Enum
define varios métodos útiles, que están disponibles para todo tipo de enumeración en Java:name()
método para obtener el nombre de las constantes Enum. El literal de cadena utilizado para escribir constantes enum es su nombre.values()
, se puede usar un método para obtener una matriz de todas las constantes Enum de un tipo Enum.valueOf()
método para convertir cualquier cadena a constante Enum en Java, como se muestra a continuación.En este fragmento de código, el
valueOf()
método devuelve una constante Enum Gender.MALE, llamando al nombre en ese retorno"MALE"
.fuente
La biblioteca commons-lang de Apache tiene una función estática org.apache.commons.lang3.EnumUtils.getEnum que asignará una Cadena a su tipo Enum. Esencialmente, la misma respuesta que Geoffreys, pero ¿por qué tirar la tuya cuando ya está en la naturaleza?
fuente
Agregando a la respuesta mejor calificada, con una útil utilidad ...
valueOf()
lanza dos Excepciones diferentes en casos donde no le gusta su entrada.IllegalArgumentException
NullPointerExeption
Si sus requisitos son tales que no tiene ninguna garantía de que su String definitivamente coincida con un valor de enumeración, por ejemplo, si los datos de String provienen de una base de datos y podrían contener una versión anterior de la enumeración, entonces deberá manejarlos a menudo...
Así que aquí hay un método reutilizable que escribí que nos permite definir una Enum predeterminada que se devolverá si la Cadena que pasamos no coincide.
Úselo así:
fuente
Como
switch
todavía no se ha mencionado una versión, la presento (reutilizando la enumeración de OP):Dado que esto no le da ningún valor adicional al
valueOf(String name)
método, solo tiene sentido definir un método adicional si queremos tener un comportamiento diferente. Si no queremos plantear unaIllegalArgumentException
, podemos cambiar la implementación a:Al proporcionar un valor por defecto mantenemos el contrato de
Enum.valueOf(String name)
sin lanzar unaIllegalArgumentException
de esa manera que en ningún casonull
se devuelve. Por lo tanto, arrojamos unNullPointerException
si el nombre esnull
y en caso dedefault
sidefaultValue
esnull
. Así es comovalueOfOrDefault
funciona.Este enfoque adopta el diseño de la
Map
interfaz que proporciona un método aMap.getOrDefault(Object key, V defaultValue)
partir de Java 8.fuente
Otra utilidad que captura de forma inversa. Usando un valor que identifica esa enumeración, no de su nombre.
Ejemplo:
EnumUtil.from(Foo.class, "drei")
regresaFoo.THREE
, porque se usarágetValue
para hacer coincidir "drei", que es un método público único, no final y no estático en Foo. En caso de Foo tiene más de método público, no es definitiva y no estática, por ejemplo,getTranslate
que devuelve "Drei", el otro método puede ser utilizado:EnumUtil.from(Foo.class, "drei", "getTranslate")
.fuente
Solución Kotlin
Crea una extensión y luego llama
valueOf<MyEnum>("value")
. Si el tipo no es válido, obtendrá nulo y tendrá que manejarloAlternativamente, puede establecer un valor predeterminado, llamar
valueOf<MyEnum>("value", MyEnum.FALLBACK)
y evitar una respuesta nula. Puede ampliar su enumeración específica para que el valor predeterminado sea automáticoO si quieres ambos, haz el segundo:
fuente
Me gusta usar este tipo de proceso para analizar comandos como cadenas en enumeraciones. Normalmente tengo una de las enumeraciones como "desconocida", por lo que es útil que la devuelvan cuando no se encuentran las otras (incluso sin distinción de mayúsculas y minúsculas) en lugar de nulas (lo que significa que no hay valor). Por lo tanto, uso este enfoque.
fuente
La forma más rápida de obtener el nombre de enum es crear un mapa de texto y valor de enumeración cuando se inicia la aplicación, y para obtener el nombre, llame a la función Blah.getEnumName ():
fuente