Qual é a melhor maneira de fazer com que um enum
tipo represente um conjunto de strings?
Eu tentei isso:
enum Strings{
STRING_ONE("ONE"), STRING_TWO("TWO")
}
Como posso então usá-los como Strings
?
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();
private String text
deve ser final.final
seria melhor.new
o construtorprivate
. Essencialmente, a criação de objetos é proibida efinal
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ê usasseString
constantes, não o declarariapublic 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,
A execução do seguinte código de teste produzirá isso:
fonte
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 substituirtoString()
; Eu acredito que é melhor usar um getter explícito, como agetKey()
substituiçãotoString()
pode ser inesperada por outro usuário da enum.Use seu
name()
método:rendimentos
ONE
.fonte
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çãoDefina 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:
É importante ter as constantes no topo e os métodos / atributos na parte inferior.
fonte
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)
ouString s = "Hello "+STRING_TWO
, mas quando você realmente precisar de Strings (por exemploSTRING_ONE.toLowerCase()
), poderá preferir defini-los como constantes:fonte
toLowerCase()
minha solução, eles podem irStrings.STRING_TWO.toString().toLowerCase()
.interface
no lugar de umafinal
classe com oprivate
construtor. É uma prática desencorajada.Você pode usar isso para a string Enum
E chamar do método principal
fonte
Se você não deseja usar construtores e deseja ter um nome especial para o método, tente o seguinte:
Suspeito que esta seja a solução mais rápida . Não há necessidade de usar variáveis finais .
fonte
Obtenha e defina com valores padrão.
fonte