Usar valores de enumeración como literales de cadena
¿Cuál es la mejor manera de utilizar los valores almacenados en una enumeración como literales de cadena? Por ejemplo:
public enum Modes {
some-really-long-string,
mode1,
mode2,
mode3
}
Luego podría usar Mode.mode1
para devolver su representación de cadena como mode1
. Sin tener que seguir llamando Mode.mode1.toString()
.
No puedes. Creo que tienes CUATRO opciones aquí. Los cuatro ofrecen una solución pero con un enfoque ligeramente diferente...
Opción uno: usar el integrado name()
en una enumeración. Esto está perfectamente bien si no necesita ningún formato de nombre especial.
String name = Modes.mode1.name(); // Returns the name of this enum constant, exactly as declared in its enum declaration.
Opción dos: agregue propiedades primordiales a sus enumeraciones si desea tener más control
public enum Modes {
mode1 ("Fancy Mode 1"),
mode2 ("Fancy Mode 2"),
mode3 ("Fancy Mode 3");
private final String name;
private Modes(String s) {
name = s;
}
public boolean equalsName(String otherName) {
// (otherName == null) check is not needed because name.equals(null) returns false
return name.equals(otherName);
}
public String toString() {
return this.name;
}
}
Opción tres: usar finales estáticos en lugar de enumeraciones:
public final class Modes {
public static final String MODE_1 = "Fancy Mode 1";
public static final String MODE_2 = "Fancy Mode 2";
public static final String MODE_3 = "Fancy Mode 3";
private Modes() { }
}
Opción cuatro: las interfaces tienen todos los campos públicos, estáticos y finales:
public interface Modes {
String MODE_1 = "Fancy Mode 1";
String MODE_2 = "Fancy Mode 2";
String MODE_3 = "Fancy Mode 3";
}
Cada enumeración tiene un método name()
y un valueOf(String)
método. El primero devuelve el nombre de la cadena de la enumeración y el segundo proporciona el valor de la enumeración cuyo nombre es la cadena. ¿Es esto lo que estás buscando?
String name = Modes.mode1.name();
Modes mode = Modes.valueOf(name);
También hay una estática valueOf(Class, String)
en Enum
sí misma, por lo que también puedes usar:
Modes mode = Enum.valueOf(Modes.class, name);
Puede anular el toString()
método para cada valor de enumeración.
Ejemplo:
public enum Country {
DE {
@Override
public String toString() {
return "Germany";
}
},
IT {
@Override
public String toString() {
return "Italy";
}
},
US {
@Override
public String toString() {
return "United States";
}
}
}
Uso:
public static void main(String[] args) {
System.out.println(Country.DE); // Germany
System.out.println(Country.IT); // Italy
System.out.println(Country.US); // United States
}