with values valueof type example enum define java enums enumeration converter

values - java enum valueof



Cómo convertir el resultado de string de enum con overrined toString() a enum? (6)

De acuerdo con el elemento 30 efectivo de Java (2nd ed), puede ser (es mucho más rápido que el bucle)

public enum AgeRange { A18TO23("18-23"), A24TO29("24-29"), A30TO35("30-35"); private final String value; AgeRange(String value){ this.value = value; } @Override public String toString(){ return value; } private static final Map<String, AgeRange> stringToEnum = new HashMap<String, AgeRange>(); static { for (AgeRange r : values()) { stringToEnum.put(r.toString(), r); } } public static AgeRange getByValue(String value){ return stringToEnum.get(value); } }

Dado el siguiente enum de Java:

public enum AgeRange { A18TO23 { public String toString() { return "18 - 23"; } }, A24TO29 { public String toString() { return "24 - 29"; } }, A30TO35 { public String toString() { return "30 - 35"; } }, }

¿Hay alguna manera de convertir un valor de cadena de "18 - 23" al valor enum correspondiente, es decir, AgeRange.A18TO23?

¡Gracias!


La clase anula "toString ()" - por lo tanto, para obtener la operación inversa, debe sobrescribir valueOf() para traducir la salida de toString() a los valores Enum.

public enum AgeRange { A18TO23 { public String toString() { return "18 - 23"; } public AgeRange valueOf (Class enumClass, String name) { return A18T023 } }, . . . }

Cuidado con el comprador: sin compilar ni probado ...

El mecanismo para toString() y valueOf() es una parte documentada de la API


La mejor y más simple forma de hacerlo es así:

public enum AgeRange { A18TO23 ("18-23"), A24TO29 ("24-29"), A30TO35("30-35"); private String value; AgeRange(String value){ this.value = value; } public String toString(){ return value; } public static AgeRange getByValue(String value){ for (final AgeRange element : EnumSet.allOf(AgeRange.class)) { if (element.toString().equals(value)) { return element; } } return null; } }

Entonces solo necesita invocar el método getByValue() con la entrada String en él.


Podrías probar algo como lo siguiente?

static AgeRange fromString(String range) { for (AgeRange ageRange : values()) { if (range.equals(ageRange.toString())) { return ageRange; } } return null; }

O, como otros sugirieron, usando un enfoque de almacenamiento en caché:

private static Map<String, AgeRange> map; private static synchronized void registerAgeRange(AgeRange ageRange) { if (map == null) { map = new HashMap<String, AgeRange>(); } map.put(ageRange.toString(), ageRange); } AgeRange() { registerAgeRange(this); } static AgeRange fromString(String range) { return map.get(range); }


Siempre puede crear un mapa de cadena a valor: hágalo de manera estática, de modo que solo necesita asignarlo una vez, suponiendo que la cadena devuelta permanezca igual a lo largo del tiempo. No hay nada incorporado, hasta donde yo sé.


for (AgeRange ar: EnumSet.allOf(AgeRange)) { if (ar.toString().equals(inString)) { myAnswer = ar; break; } }

¿O algo así? Simplemente tecleé, no he corrido a través de un compilador. Perdonar (comentar) errores tipográficos ...

O use lógica como esta para construir un mapa una vez. Evite la iteración en tiempo de ejecución. Buena idea, Jon.