En envoyant des énumérations entre mon code Java et une base de données ou une application cliente, je finis souvent par lire et écrire les valeurs d'énumération sous forme de chaînes. toString()
est appelé implicitement lors de la concaténation de chaînes. Remplacer toString () sur certaines énumérations signifiait que parfois je pouvais juste
"<input type='checkbox' value='" + MY_CONST1 + "'>"
et parfois je devais me rappeler d'appeler
"<input type='checkbox' value='" + MY_CONST1.name() + "'>"
ce qui a conduit à des erreurs, donc je ne fais plus ça. En fait, je ne remplace aucune méthode sur Enum, car si vous les jetez dans suffisamment de code client, vous finirez par briser les attentes de quelqu'un.
Créez votre propre nouveau nom de méthode, comme public String text()
ou toEnglish()
ou quoi que ce soit.
Voici une petite fonction d'aide qui pourrait vous éviter de taper si vous avez beaucoup d'énumérations comme ci-dessus:
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();
}
}
Il est toujours facile d'appeler .toUpperCase () ou .toLowerCase () mais le retour en casse mixte peut être délicat. Considérez la couleur, "bleu de France". La France est toujours en majuscule, donc vous voudrez peut-être ajouter une méthode textLower () à votre énumération si vous rencontrez cela. Lorsque vous utilisez ce texte au début d'une phrase, par rapport au milieu d'une phrase, par rapport à un titre, vous pouvez voir comment une seule toString()
méthode va échouer. Et cela ne touche même pas les caractères illégaux dans les identificateurs Java, ou qui sont difficiles à taper car ils ne sont pas représentés sur les claviers standard, ou les caractères qui n'ont pas de casse (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);
}
}
Il n'est pas si difficile de les utiliser correctement:
IllegalStateException(color1.textUcFirst() + " clashes horribly with " +
color2.textLc() + "!")
J'espère que cela démontre également pourquoi l'utilisation de valeurs d'énumération à casse mixte vous décevra également. Une dernière raison de conserver les majuscules avec des constantes enum soulignées est que cela suit le principe du moindre étonnement. Les gens s'y attendent, donc si vous faites quelque chose de différent, vous devrez toujours vous expliquer ou traiter avec des gens qui abusent de votre code.