Wysyłając wyliczenia między moim kodem Java a bazą danych lub aplikacją klienta, często kończę na czytaniu i zapisywaniu wartości wyliczania jako ciągów. toString()
nazywa się niejawnie podczas łączenia łańcuchów. Przesłonięcie metody toString () w niektórych wyliczeniach oznaczało, że czasami mogłem po prostu
"<input type='checkbox' value='" + MY_CONST1 + "'>"
i czasami musiałem pamiętać, żeby zadzwonić
"<input type='checkbox' value='" + MY_CONST1.name() + "'>"
co doprowadziło do błędów, więc już tego nie robię. Właściwie nie zastępuję żadnych metod na Enum, ponieważ jeśli podrzucisz je do wystarczającej liczby kodów klienta, ostatecznie złamiesz czyjeś oczekiwania.
Zrobić własną nową nazwę metody, jak public String text()
i toEnglish()
czy cokolwiek innego.
Oto mała funkcja pomocnika, która może zaoszczędzić trochę pisania, jeśli masz wiele wyliczeń takich jak powyżej:
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();
}
}
Zawsze łatwo jest wywołać .toUpperCase () lub .toLowerCase (), ale odzyskanie mieszanych liter może być trudne. Rozważ kolor „bleu de France”. Francja jest zawsze pisana wielkimi literami, więc jeśli chcesz, możesz dodać metodę textLower () do swojego wyliczenia. Kiedy użyjesz tego tekstu na początku zdania, w środku zdania, a w tytule, zobaczysz, jak jedna toString()
metoda może się nie udać. I to nawet nie dotyka znaków, które są niedozwolone w identyfikatorach Java, lub których pisanie jest trudne, ponieważ nie są reprezentowane na standardowych klawiaturach, ani znaków, które nie mają wielkości liter (Kanji itp.).
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);
}
}
Prawidłowe korzystanie z nich nie jest takie trudne:
IllegalStateException(color1.textUcFirst() + " clashes horribly with " +
color2.textLc() + "!")
Mam nadzieję, że to również pokazuje, dlaczego stosowanie wartości wyliczania mieszanych wielkości liter również Cię rozczaruje. Ostatnim powodem, dla którego warto trzymać się wielkich liter ze stałymi enum podkreślenia, jest to, że postępuje to zgodnie z zasadą najmniejszego zdziwienia. Ludzie tego oczekują, więc jeśli zrobisz coś innego, zawsze będziesz musiał wyjaśniać siebie lub radzić sobie z ludźmi niewłaściwie używającymi twojego kodu.