Wenn ich Enums zwischen meinem Java-Code und einer Datenbank oder Client-App sende, lese und schreibe ich die Enum-Werte häufig als Zeichenfolgen. toString()
wird implizit aufgerufen, wenn Zeichenfolgen verkettet werden. Das Überschreiben von toString () in einigen Aufzählungen bedeutete, dass ich es manchmal einfach konnte
"<input type='checkbox' value='" + MY_CONST1 + "'>"
und manchmal musste ich daran denken anzurufen
"<input type='checkbox' value='" + MY_CONST1.name() + "'>"
was zu Fehlern führte, also mache ich das nicht mehr. Eigentlich überschreibe ich keine Methoden in Enum, denn wenn Sie sie in genügend Client-Code umwandeln, werden Sie irgendwann die Erwartungen von jemandem brechen.
Machen Sie Ihren eigenen neuen Methodennamen, wie public String text()
oder toEnglish()
oder was auch immer.
Hier ist eine kleine Hilfsfunktion, die Ihnen das Tippen ersparen könnte, wenn Sie viele Aufzählungen wie die oben genannten haben:
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();
}
}
Es ist immer einfach, .toUpperCase () oder .toLowerCase () aufzurufen, aber es kann schwierig sein, gemischte Groß- und Kleinschreibung zurückzugewinnen. Betrachten Sie die Farbe "bleu de France". Frankreich wird immer groß geschrieben, daher möchten Sie möglicherweise eine textLower () -Methode zu Ihrer Aufzählung hinzufügen, wenn Sie darauf stoßen. Wenn Sie diesen Text am Anfang eines Satzes oder in der Mitte eines Satzes oder in einem Titel verwenden, können Sie sehen, wie eine einzelne toString()
Methode zu kurz kommt. Und das berührt nicht einmal Zeichen, die in Java-Bezeichnern illegal sind oder deren Eingabe schwierig ist, weil sie nicht auf Standardtastaturen dargestellt werden, oder Zeichen, die keine Groß- / Kleinschreibung haben (Kanji usw.).
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);
}
}
Es ist nicht so schwierig, diese richtig zu verwenden:
IllegalStateException(color1.textUcFirst() + " clashes horribly with " +
color2.textLc() + "!")
Hoffentlich zeigt dies auch, warum die Verwendung von Enum-Werten in gemischten Groß- und Kleinschreibung Sie ebenfalls enttäuschen wird. Ein letzter Grund, bei All-Caps mit Unterstreichungs-Enum-Konstanten zu bleiben, ist, dass dies dem Prinzip des geringsten Erstaunens folgt. Die Leute erwarten es. Wenn Sie also etwas anderes tun, müssen Sie sich immer selbst erklären oder mit Leuten umgehen, die Ihren Code missbrauchen.