Respostas:
Não sei o que você quer fazer, mas foi assim que traduzi seu código de exemplo ....
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;
}
}
Como alternativa, você pode criar um método getter para text
.
Agora você pode fazer Strings.STRING_ONE.toString();
final
seria melhor.
new
o construtor private
. Essencialmente, a criação de objetos é proibida e final
não é realmente necessária neste caso.
setText(String)
em enum e isso pode desencadear o inferno :) final
meio que documenta sua intenção de que é uma constante com o suporte ao compilador. Se você usasse String
constantes, não o declararia public static String
, certo?
Valores de sequência personalizados para enum
de http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html
O valor padrão da string para java enum é seu valor de face ou o nome do elemento. No entanto, você pode personalizar o valor da sequência substituindo o método toString (). Por exemplo,
public enum MyType {
ONE {
public String toString() {
return "this is one";
}
},
TWO {
public String toString() {
return "this is two";
}
}
}
A execução do seguinte código de teste produzirá isso:
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
diretório: EnumTest $ MyType.class EnumTest $ MyType $ 1.class EnumTest $ MyType $ 2.class que somará reais rápido. É melhor fazê-lo como a resposta esperada, passando valores ao construtor enum. Na verdade, eu discordo de substituir toString()
; Eu acredito que é melhor usar um getter explícito, como a getKey()
substituição toString()
pode ser inesperada por outro usuário da enum.
Use seu 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
}
rendimentos ONE
.
Strings.STRING_ONE.name()
gera "STRING_ONE", não "ONE". Isso simplesmente não é uma boa resposta. Você não pode ter nenhuma String que não seja um identificador Java válido etc.
name()
pode ser afetado por um programa ofuscador. Encontrei um problema semelhante há um tempo atrás. Por exemplo, com o Proguard, você precisa solucionar isso. Consulte Processando classes de enumeração
Defina o nome da enumeração para ser o mesmo que a sequência desejada ou, de maneira mais geral, você pode associar atributos arbitrários aos seus valores de enumeração:
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.
}
É importante ter as constantes no topo e os métodos / atributos na parte inferior.
Dependendo do que você quer dizer com "use-as como Strings", talvez você não queira usar uma enumeração aqui. Na maioria dos casos, a solução proposta pelo The Elite Gentleman permitirá que você os use por meio dos métodos toString, por exemplo, em System.out.println(STRING_ONE)
ou String s = "Hello "+STRING_TWO
, mas quando você realmente precisar de Strings (por exemplo STRING_ONE.toLowerCase()
), poderá preferir defini-los como constantes:
public interface Strings{
public static final String STRING_ONE = "ONE";
public static final String STRING_TWO = "TWO";
}
toLowerCase()
minha solução, eles podem ir Strings.STRING_TWO.toString().toLowerCase()
.
interface
no lugar de uma final
classe com o private
construtor. É uma prática desencorajada.
Você pode usar isso para a string 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;
}
}
E chamar do 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());
}
}
Se você não deseja usar construtores e deseja ter um nome especial para o método, tente o seguinte:
public enum MyType {
ONE {
public String getDescription() {
return "this is one";
}
},
TWO {
public String getDescription() {
return "this is two";
}
};
public abstract String getDescription();
}
Suspeito que esta seja a solução mais rápida . Não há necessidade de usar variáveis finais .
private String text
deve ser final.