Respuestas:
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();
final
sería lo mejor.
new
como lo es el constructor private
. Esencialmente, la creación de objetos está prohibida y final
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 usaras String
constantes, no lo declararías como public 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,
public enum MyType {
ONE {
public String toString() {
return "this is one";
}
},
TWO {
public String toString() {
return "this is two";
}
}
}
Ejecutar el siguiente código de prueba producirá esto:
public class EnumTest {
public static void main(String[] args) {
System.out.println(MyType.ONE);
System.out.println(MyType.TWO);
}
}
this is one
this is two
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 anular toString()
; Creo que es mejor usar un getter explícito, getKey()
ya que la anulación toString()
puede ser inesperada por otro usuario de la enumeración.
Utiliza su name()
método:
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(Strings.ONE.name());
}
}
enum Strings {
ONE, TWO, THREE
}
rendimientos ONE
.
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ón
Establezca 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:
enum Strings {
STRING_ONE("ONE"), STRING_TWO("TWO");
private final String stringValue;
Strings(final String s) { stringValue = s; }
public String toString() { return stringValue; }
// further methods, attributes, etc.
}
Es importante tener las constantes en la parte superior y los métodos / atributos en la parte inferior.
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)
o String s = "Hello "+STRING_TWO
, pero cuando realmente necesite cadenas (por ejemplo STRING_ONE.toLowerCase()
), puede preferir definirlas como constantes:
public interface Strings{
public static final String STRING_ONE = "ONE";
public static final String STRING_TWO = "TWO";
}
toLowerCase()
mi solución, pueden irse Strings.STRING_TWO.toString().toLowerCase()
.
interface
en lugar de una final
clase con private
constructor. Es una práctica desanimada.
Puedes usar eso para la cadena Enum
public enum EnumTest {
NAME_ONE("Name 1"),
NAME_TWO("Name 2");
private final String name;
/**
* @param name
*/
private EnumTest(final String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Y llamar desde el método principal
public class Test {
public static void main (String args[]){
System.out.println(EnumTest.NAME_ONE.getName());
System.out.println(EnumTest.NAME_TWO.getName());
}
}
Si no desea utilizar constructores , y desea tener un nombre especial para el método, intente esto:
public enum MyType {
ONE {
public String getDescription() {
return "this is one";
}
},
TWO {
public String getDescription() {
return "this is two";
}
};
public abstract String getDescription();
}
Sospecho que esta es la solución más rápida . No hay necesidad de usar variables finales .
private String text
debería ser definitivo.