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.