¿Cuál es la mejor manera de hacer que un enum
tipo represente un conjunto de cadenas?
Intenté esto:
enum Strings{
STRING_ONE("ONE"), STRING_TWO("TWO")
}
¿Cómo puedo usarlos como Strings
?
No sé qué quieres hacer, pero así es como traduje tu código de ejemplo ...
package test;
/**
* @author The Elite Gentleman
*
*/
public enum Strings {
STRING_ONE("ONE"),
STRING_TWO("TWO")
;
private final String text;
/**
* @param text
*/
Strings(final String text) {
this.text = text;
}
/* (non-Javadoc)
* @see java.lang.Enum#toString()
*/
@Override
public String toString() {
return text;
}
}
Alternativamente, puede crear un método getter para text
.
Ahora puedes hacer Strings.STRING_ONE.toString();
private String text
debería ser definitivo.final
sería lo mejor.new
como lo es el constructorprivate
. Esencialmente, la creación de objetos está prohibida yfinal
no es realmente necesaria en este caso.setText(String)
enum y eso puede desatar el infierno :)final
tipo de documentos de su intención de que sea una constante con el soporte del compilador. Si usarasString
constantes, no lo declararías comopublic static String
, ¿verdad?Valores de cadena personalizados para Enum
de http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html
El valor de cadena predeterminado para java enum es su valor nominal o el nombre del elemento. Sin embargo, puede personalizar el valor de la cadena anulando el método toString (). Por ejemplo,
Ejecutar el siguiente código de prueba producirá esto:
fuente
bin
directorio: EnumTest $ MyType.class EnumTest $ MyType $ 1.class EnumTest $ MyType $ 2.class que se sumará muy rápido. Es mejor hacerlo como la respuesta esperada, pasando valores al constructor enum. En realidad no estoy de acuerdo con anulartoString()
; Creo que es mejor usar un getter explícito,getKey()
ya que la anulacióntoString()
puede ser inesperada por otro usuario de la enumeración.Utiliza su
name()
método:rendimientos
ONE
.fuente
Strings.STRING_ONE.name()
produce "STRING_ONE", no "ONE". Esto simplemente no es una buena respuesta. No puede tener ninguna cadena que no sea un identificador de Java válido, etc.name()
puede verse afectado por un programa ofuscador. Me encontré con un problema similar hace un tiempo. Por ejemplo, con Proguard necesita evitar esto. Ver clases de tratamiento de enumeraciónEstablezca el nombre de enumeración para que sea el mismo que la cadena que desea o, más generalmente, puede asociar atributos arbitrarios con sus valores de enumeración:
Es importante tener las constantes en la parte superior y los métodos / atributos en la parte inferior.
fuente
Dependiendo de lo que quiera decir con "utilizarlos como cadenas", es posible que no desee utilizar una enumeración aquí. En la mayoría de los casos, la solución propuesta por The Elite Gentleman le permitirá usarlos a través de sus métodos toString, por ejemplo, en
System.out.println(STRING_ONE)
oString s = "Hello "+STRING_TWO
, pero cuando realmente necesite cadenas (por ejemploSTRING_ONE.toLowerCase()
), puede preferir definirlas como constantes:fuente
toLowerCase()
mi solución, pueden irseStrings.STRING_TWO.toString().toLowerCase()
.interface
en lugar de unafinal
clase conprivate
constructor. Es una práctica desanimada.Puedes usar eso para la cadena Enum
Y llamar desde el método principal
fuente
Si no desea utilizar constructores , y desea tener un nombre especial para el método, intente esto:
Sospecho que esta es la solución más rápida . No hay necesidad de usar variables finales .
fuente
Obtener y establecer con valores predeterminados.
fuente