Inviando enum tra il mio codice Java e un database o un'app client, finisco spesso per leggere e scrivere i valori enum come stringhe. toString()
viene chiamato implicitamente quando si concatenano le stringhe. Sovrascrivere toString () su alcuni enum significava che a volte potevo semplicemente
"<input type='checkbox' value='" + MY_CONST1 + "'>"
e a volte dovevo ricordare di chiamare
"<input type='checkbox' value='" + MY_CONST1.name() + "'>"
che ha portato a errori, quindi non lo faccio più. In realtà, non sovrascrivo alcun metodo su Enum perché se li lanci a un codice client sufficiente, alla fine infrangerai le aspettative di qualcuno.
Rendere il proprio nome nuovo metodo, come public String text()
o toEnglish()
o qualsiasi altra cosa.
Ecco una piccola funzione di aiuto che potrebbe salvarti un po 'di battitura se hai molti enum come il precedente:
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 facile chiamare .toUpperCase () o .toLowerCase (), ma tornare indietro in maiuscolo può essere complicato. Considera il colore "bleu de France". La Francia è sempre in maiuscolo, quindi potresti voler aggiungere un metodo textLower () al tuo enum se ti imbatti in quello. Quando si utilizza questo testo all'inizio di una frase, rispetto al centro di una frase, rispetto a un titolo, è possibile vedere come un singolo toString()
metodo non funzionerà. E questo non tocca nemmeno i caratteri illegali negli identificatori Java o che sono difficili da digitare perché non sono rappresentati su tastiere standard o caratteri che non hanno maiuscole (Kanji, ecc.).
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);
}
}
Non è così difficile usarli correttamente:
IllegalStateException(color1.textUcFirst() + " clashes horribly with " +
color2.textLc() + "!")
Speriamo che ciò dimostri anche perché l'uso di valori enum in maiuscolo ti deluderà. Un'ultima ragione per continuare con le maiuscole e minuscole costanti enum è che ciò segue il principio del minimo stupore. Le persone se lo aspettano, quindi se fai qualcosa di diverso, dovrai sempre spiegare te stesso o avere a che fare con persone che abusano del tuo codice.