Pregunta Buscar enum de Java por valor de cadena
Digamos que tengo una enumeración que es solo
public enum Blah {
A, B, C, D
}
y me gustaría encontrar el valor enum de una cadena, por ejemplo "A"
cuál podría ser Blah.A
. ¿Cómo sería posible hacer esto?
Es el Enum.valueOf()
el método que necesito? Si es así, ¿cómo usaría esto?
1590
2018-03-02 22:56
origen
Respuestas:
Sí, Blah.valueOf("A")
Te regalaré Blah.A
.
Tenga en cuenta que el nombre debe ser un exacto coincidencia, incluido el caso: Blah.valueOf("a")
y Blah.valueOf("A ")
ambos arrojan un IllegalArgumentException
.
Los métodos estáticos valueOf()
y values()
se crean en tiempo de compilación y no aparecen en el código fuente. Sin embargo, aparecen en Javadoc; por ejemplo, Dialog.ModalityType
muestra ambos métodos.
1851
2018-03-02 22:57
Otra solución si el texto no es el mismo que el valor de enumeración:
public enum Blah {
A("text1"),
B("text2"),
C("text3"),
D("text4");
private String text;
Blah(String text) {
this.text = text;
}
public String getText() {
return this.text;
}
public static Blah fromString(String text) {
for (Blah b : Blah.values()) {
if (b.text.equalsIgnoreCase(text)) {
return b;
}
}
return null;
}
}
709
2018-06-03 10:57
Aquí hay una utilidad ingeniosa que uso:
/**
* A common method for all enums since they can't have another base class
* @param <T> Enum type
* @param c enum type. All enums must be all caps.
* @param string case insensitive
* @return corresponding enum, or null
*/
public static <T extends Enum<T>> T getEnumFromString(Class<T> c, String string) {
if( c != null && string != null ) {
try {
return Enum.valueOf(c, string.trim().toUpperCase());
} catch(IllegalArgumentException ex) {
}
}
return null;
}
Luego, en mi clase enum, generalmente tengo esto para guardar algo de tipeo:
public static MyEnum fromString(String name) {
return getEnumFromString(MyEnum.class, name);
}
Si sus enumeraciones no son mayúsculas, simplemente cambie la Enum.valueOf
línea.
Lástima que no puedo usar T.class
para Enum.valueOf
como T
es borrado
98
2017-11-12 15:52
También debe tener cuidado con su caso. Déjame explicarte: haciendo Blah.valueOf("A")
funciona, pero Blah.valueOf("a")
no trabajará. Entonces otra vez Blah.valueOf("a".toUpperCase(Locale.ENGLISH))
trabajaría.
editar
Cambiado toUpperCase
a toUpperCase(Locale.ENGLISH)
Residencia en tc. comentario y el documentos de java
edit2
En Android debes usar Locale.US
, como sulai señala.
66
2018-05-09 16:33
Usa el patrón de Joshua Bloch, Java efectivo:
(simplificado por brevedad)
enum MyEnum {
ENUM_1("A"),
ENUM_2("B");
private String name;
private static final Map<String,MyEnum> ENUM_MAP;
MyEnum (String name) {
this.name = name;
}
public String getName() {
return this.name;
}
// Build an immutable map of String name to enum pairs.
// Any Map impl can be used.
static {
Map<String,MyEnum> map = new ConcurrentHashMap<String,MyEnum>();
for (MyEnum instance : MyEnum.values()) {
map.put(instance.getName(),instance);
}
ENUM_MAP = Collections.unmodifiableMap(map);
}
public static MyEnum get (String name) {
return ENUM_MAP.get(name);
}
}
Ver también:
Oracle Java Example utilizando Enum y Map of instances
Orden de ejecución de bloques estáticos en un tipo Enum
¿Cómo puedo buscar una enumeración Java a partir de su valor de cadena?
37
2018-06-15 16:37
Aquí hay un método que puede hacerlo para cualquier Enum, y no distingue entre mayúsculas y minúsculas.
/**
* Finds the value of the given enumeration by name, case-insensitive.
* Throws an IllegalArgumentException if no match is found.
**/
public static <T extends Enum<T>> T valueOfIgnoreCase(
Class<T> enumeration, String name) {
for (T enumValue : enumeration.getEnumConstants()) {
if (enumValue.name().equalsIgnoreCase(name)) {
return enumValue;
}
}
throw new IllegalArgumentException(String.format(
"There is no value with name '%s' in Enum %s",
name, enumeration.getName()
));
}
35
2017-12-01 21:53
Utilizando Blah.valueOf(string)
es mejor pero puedes usar Enum.valueOf(Blah.class, string)
también.
28
2018-05-09 17:23