Várias vezes eu já vi pessoas usarem maiúsculas ou minúsculas para constantes enum, por exemplo:
enum Color {
red,
yellow,
green;
}
Isso simplifica e facilita o trabalho com a forma de sequência, se você quiser throw new IllegalStateException("Light should not be " + color + ".")
, por exemplo.
Isso parece mais aceitável se o enum for private
, mas ainda não gosto. Eu sei que posso criar um construtor de enum com um campo String e substituir toString para retornar esse nome, assim:
enum Color {
RED("red"),
YELLOW("yellow"),
GREEN("green");
private final String name;
private Color(String name) {
this.name = name
}
@Override public String toString() {
return name;
}
}
Mas veja quanto tempo isso é. É chato continuar fazendo se você tem um monte de pequenas enumerações que deseja manter simples. Tudo bem usar apenas formatos de caso não convencionais aqui?
java
conventions
enum
quebra-código
fonte
fonte
Light should not be RED.
. Afinal, esta mensagem é para o desenvolvedor, o usuário nunca deve vê-la.Light should not be YELLOW.
, acho que é uma constante de algum tipo, o método toString () é apenas para fins de depuração, portanto não vejo por que você precisa alterar a aparência dessa mensagem.Respostas:
A resposta curta é, obviamente, se você deseja interromper as convenções de nomenclatura para o que são essencialmente constantes ... Citando o JLS :
A resposta longa, com relação ao uso de
toString()
, é definitivamente esse o método a ser substituído, se você quiser uma representação mais legível dosenum
valores. CitandoObject.toString()
(ênfase minha):Agora, não sei por que algumas das respostas se voltaram para falar sobre a conversão
enums
de um lado para outro comString
valores, mas também darei minha opinião aqui. Tal serialização deenum
valores pode ser facilmente tomado cuidado usando oname()
ouordinal()
métodos. Ambos sãofinal
e, portanto, você pode ter certeza dos valores retornados, desde que os nomes ou o posicionamento dos valores não sejam alterados . Para mim, isso é um marcador suficientemente claro.O que recordo do exposto é: hoje, você pode querer descrever
YELLOW
simplesmente como "amarelo". Amanhã, você pode descrevê-lo como "Pantone Minion Yellow" . Estas descrições devem ser devolvidos a partir chamandotoString()
, e eu não esperaria tantoname()
ouordinal()
à mudança. Se o fizer, é algo que preciso resolver na minha base de código ou na minha equipe e se tornará uma questão maior do que apenas umenum
estilo de nomeação .Concluindo, se tudo o que você pretende fazer é registrar uma representação mais legível dos seus
enum
valores, ainda assim sugerirei seguir as convenções e depois substituí-lastoString()
. Se você também pretende serializá-los em um arquivo de dados ou em outros destinos que não sejam Java, você ainda tem os métodosname()
eordinal()
para fazer backup de você, portanto não há necessidade de se preocupar em substituirtoString()
.fonte
Não modifique
ENUM
isso é apenas mau cheiro de código. Deixe um enum ser um enum e uma string ser uma string.Em vez disso, use um conversor CamelCase para valores de sequência.
Existem muitas bibliotecas de código aberto que já resolvem esse problema para Java.
http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/CaseFormat.html
fonte
Ao enviar enumerações entre meu código Java e um banco de dados ou aplicativo cliente, geralmente acabo lendo e gravando os valores de enumeração como seqüências de caracteres.
toString()
é chamado implicitamente ao concatenar seqüências de caracteres. Substituir toString () em algumas enumerações significava que, às vezes, eu podiae às vezes eu tinha que lembrar de ligar
o que levou a erros, então eu não faço mais isso. Na verdade, eu não substituo nenhum método no Enum, porque se você aplicá-lo a um código de cliente suficiente, acabará quebrando as expectativas de alguém.
Faça o seu próprio nome novo método, como
public String text()
outoEnglish()
ou qualquer outra coisa.Aqui está uma pequena função auxiliar que pode economizar algumas digitações se você tiver muitas enumerações como as acima:
É sempre fácil chamar .toUpperCase () ou .toLowerCase (), mas voltar a maiúsculas e minúsculas pode ser complicado. Considere a cor "bleu de France". A França está sempre em maiúscula, portanto, você pode adicionar um método textLower () à sua enumeração, se você o encontrar. Quando você usa esse texto no início de uma frase, no meio de uma frase e em um título, pode ver como um único
toString()
método ficará aquém. E isso nem toca em caracteres que são ilegais nos identificadores Java, ou que são difíceis de digitar porque não são representados em teclados padrão ou caracteres que não possuem maiúsculas (Kanji, etc.).Não é tão difícil usá-los corretamente:
Espero que isso também demonstre por que o uso de valores de enumeração de maiúsculas e minúsculas também o decepcionará. Um último motivo para manter as letras maiúsculas com sublinhados constantes enum é que isso segue o Princípio da menor surpresa. As pessoas esperam isso; portanto, se você fizer algo diferente, sempre terá que se explicar ou lidar com pessoas que abusam do seu código.
fonte
toString()
um enum não faz sentido para mim. Se você deseja o comportamento padrão garantido dos nomes de enum, usename()
. Não acho "tentador" confiar em tudotoString()
para fornecer a chave corretavalueOf(String)
. Eu acho que se você quiser proteger seus enums com idiotas, isso é uma coisa, mas não acho que seja uma razão boa o suficiente para recomendar que você nunca deve substituirtoString()
.<input type='checkbox' value=" + MY_CONST1 + ">
, e às vezes tinha que me lembrar de ligar<input type='checkbox' value=" + MY_CONST1.name() + ">
, o que levava a erros.Se houver a menor chance de que essas representações de seqüência de caracteres possam ser armazenadas em locais como bancos de dados ou arquivos de texto, vinculá-las às constantes reais da enumeração se tornará altamente problemática se você precisar refatorar sua enumeração.
E se um dia você decidir mudar o nome
Color.White
paraColor.TitaniumWhite
quando houver arquivos de dados lá fora, que contêm "White"?Além disso, quando você começa a converter constantes enum em strings, o próximo passo adiante é gerar strings para o usuário ver, e o problema aqui é, como eu já sei, que a sintaxe do java não permitir espaços dentro dos identificadores. (Você nunca terá
Color.Titanium White
.) Portanto, como você provavelmente precisará de um mecanismo apropriado para gerar nomes de enumeração para mostrar ao usuário, é melhor evitar complicar desnecessariamente sua enumeração.Dito isto, é claro que você pode seguir em frente e fazer o que estava pensando em fazer, e depois refatorar sua enumeração mais tarde, para passar nomes ao construtor, quando (e se) tiver problemas.
Você pode raspar algumas linhas do seu enum-com-construtor declarando o
name
campopublic final
e perdendo o getter. (Que amor é esse que os programadores java têm em relação aos getters?)fonte
public final static int white = 1;
oupublic final static String white = "white";
(além da quebra da convenção novamente), isso perde o tipo de segurança que a enum fornece.public final
campo de instância que é inicializado a partir do construtor se comporta exatamente como um campo não final, exceto que você é impedido em tempo de compilação de atribuir a ele. Você pode modificá-lo via reflexão e todo o código que se refere a ele começará imediatamente a ver o novo valor.Indiscutivelmente, seguir a convenção de nomenclatura UPPERCASE viola DRY . (E YAGNI ). por exemplo, no exemplo de código 2: "RED" e "red" são repetidos.
Então, você segue a convenção oficial ou segue DRY? Sua chamada.
No meu código, seguirei DRY. No entanto, colocarei um comentário na classe Enum, dizendo "nem todas maiúsculas porque (explicação aqui)"
fonte