Invio di enum tra il mio codice Java e un database o un'app client, spesso finisco per leggere e scrivere i valori enum come stringhe. toString()
è chiamato implicitamente quando si concatenano le stringhe. Sovraccaricare toString () su alcune enumerazioni significava che a volte potevo solo
"<input type='checkbox' value='" + MY_CONST1 + "'>"
ea volte ho dovuto ricordare di chiamare
"<input type='checkbox' value='" + MY_CONST1.name() + "'>"
che ha portato ad errori, quindi non lo faccio più. In realtà, non sovrascrivo i metodi any su Enum perché se li metti in giro con un numero sufficiente di codice client, finirai per rompere le aspettative di qualcuno.
Crea il tuo nuovo nome di metodo, come public String text()
o toEnglish()
o qualsiasi altra cosa.
Ecco una piccola funzione di supporto che potrebbe farti risparmiare un po 'di digitazione se hai un sacco di enumerazioni come sopra:
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 a caso misto 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 questo. Quando si utilizza questo testo all'inizio di una frase, a metà di una frase, rispetto a un titolo, è possibile vedere come un singolo metodo toString()
non sarà sufficiente. E questo non tocca nemmeno i caratteri che sono illegali negli identificatori di Java, o che sono difficili da digitare perché non sono rappresentati su tastiere standard, o caratteri che non hanno case (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 utilizzarli correttamente:
IllegalStateException(color1.textUcFirst() + " clashes horribly with " +
color2.textLc() + "!")
Si spera che ciò dimostri anche perché l'uso di valori enum a caso misto ti deluderà. Un ultimo motivo per mantenere le maiuscole con le costanti di enumerazione dei caratteri di sottolineatura è che seguire questo principio è il Principio di Almost Astonishment. La gente se lo aspetta, quindi se fai qualcosa di diverso, dovrai sempre spiegare te stesso o trattare con le persone che usano male il tuo codice.