Me gustaría buscar una enumeración de su valor de cadena (o posiblemente cualquier otro valor). He intentado el siguiente código pero no permite la estática en los inicializadores. ¿Hay una manera simple?
public enum Verbosity {
BRIEF, NORMAL, FULL;
private static Map<String, Verbosity> stringMap = new HashMap<String, Verbosity>();
private Verbosity() {
stringMap.put(this.toString(), this);
}
public static Verbosity getVerbosity(String key) {
return stringMap.get(key);
}
};
stringMap
inicialización). La solución habitual es usar una clase anidada.Respuestas:
Use el
valueOf
método que se crea automáticamente para cada Enum.Para valores arbitrarios comience con:
Avanza más tarde a la implementación del mapa si tu generador de perfiles te lo indica.
Sé que está iterando sobre todos los valores, pero con solo 3 valores de enumeración no vale la pena ningún otro esfuerzo, de hecho, a menos que tenga muchos valores, no me molestaría con un Mapa, será lo suficientemente rápido.
fuente
IllegalArgumentException
nulo en lugar de devolver nulo ( es decir, cuando no se encuentra ninguna coincidencia), así es como lo hace el JDKEnum.valueOf(..)
.Estás cerca. Para valores arbitrarios, intente algo como lo siguiente:
fuente
HashMap<>
para almacenar las enumeraciones demostró ser más del 40% más rápido que un bucle forzado.con Java 8 puedes lograr de esta manera:
fuente
null
. Pero también depende del caso de usoLa respuesta de @ Lyle es bastante peligrosa y he visto que no funciona particularmente si hace que la enumeración sea una clase interna estática. En cambio, he usado algo como esto que cargará los mapas BootstrapSingleton antes de las enumeraciones.
Editar esto ya no debería ser un problema con las JVM modernas (JVM 1.6 o superior), pero creo que todavía hay problemas con JRebel, pero no he tenido la oportunidad de volver a probarlo .
Cargame primero:
Ahora cárguelo en el constructor enum:
Si tiene una enumeración interna, puede definir el Mapa sobre la definición de enumeración y eso (en teoría) debería cargarse antes.
fuente
¿Y no puedes usar valueOf () ?
Editar: Por cierto, no hay nada que te impida usar static {} en una enumeración.
fuente
valueOf
en la clase enum, por lo que no necesita especificar la clase enumClass
.En caso de que ayude a otros, la opción que prefiero, que no se encuentra aquí, utiliza la funcionalidad de Mapas de Guava :
Con el valor predeterminado que puede usar
null
, puedethrow IllegalArgumentException
ofromString
puede devolver unOptional
comportamiento que prefiera.fuente
desde java 8 puede inicializar el mapa en una sola línea y sin bloque estático
fuente
Function.identity()
antes, me parece mucho más atractivo textualmente quee -> e
.Quizás, eche un vistazo a esto. Me está funcionando. El propósito de esto es buscar 'RED' con '/ red_color'. Declarar ay
static map
cargar losenum
s solo una vez traerá algunos beneficios de rendimiento si losenum
s son muchos.Por favor, ponga sus opiniones.
fuente
Puede definir su Enum como el siguiente código:
Consulte el siguiente enlace para obtener más aclaraciones.
fuente
Si desea un valor predeterminado y no desea crear mapas de búsqueda, puede crear un método estático para manejarlo. Este ejemplo también maneja búsquedas donde el nombre esperado comenzaría con un número.
Si lo necesita en un valor secundario, simplemente construirá el mapa de búsqueda primero como en algunas de las otras respuestas.
fuente
}
fuente
Puede usar la
Enum::valueOf()
función sugerida por Gareth Davis y Brad Mace arriba, pero asegúrese de manejar laIllegalArgumentException
que se lanzaría si la cadena utilizada no está presente en la enumeración.fuente