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 podia
"<input type='checkbox' value='" + MY_CONST1 + "'>"
e às vezes eu tinha que lembrar de ligar
"<input type='checkbox' value='" + MY_CONST1.name() + "'>"
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()
ou toEnglish()
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:
public static String ucFirstLowerRest(String s) {
if ( (s == null) || (s.length() < 1) ) {
return s;
} else if (s.length() == 1) {
return s.toUpperCase();
} else {
return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
}
}
É 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.).
enum Color {
BLEU_DE_FRANCE {
@Override public String textTc() { return "Bleu De France"; }
@Override public String textLc() { return "bleu de France"; }
}
CAFE_NOIR {
@Override public String textTc() { return "Café Noir"; }
}
RED,
YELLOW,
GREEN;
// The text in title case
private final String textTc;
private Color() {
textTc = ucFirstLowerRest(this.toString());
}
// Title case
public String textTc() { return textTc; }
// For the middle of a sentence
public String textLc() { return textTc().toLowerCase(); }
// For the start of a sentence
public String textUcFirst() {
String lc = textLc();
return lc.substring(0, 1).toUpperCase() + lc.substring(1);
}
}
Não é tão difícil usá-los corretamente:
IllegalStateException(color1.textUcFirst() + " clashes horribly with " +
color2.textLc() + "!")
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.