Пересилаючи переписки між моїм кодом Java та базою даних або клієнтським додатком, я часто закінчую читання та запис значень enum у вигляді рядків. toString()
називається неявно при об'єднанні рядків. Переосмислення toString () на деяких переліках означало, що іноді я можу просто
"<input type='checkbox' value='" + MY_CONST1 + "'>"
а іноді мені доводилося пам'ятати, щоб дзвонити
"<input type='checkbox' value='" + MY_CONST1.name() + "'>"
що призвело до помилок, тому я більше цього не роблю. Насправді я не перекриваю жодних методів на Enum, тому що якщо ви перекинете їх на достатню кількість клієнтського коду, врешті ви порушите чиїсь сподівання.
Зробити свій власний нове ім'я методу, як public String text()
або toEnglish()
чи будь інший .
Ось невеличка помічна функція, яка може заощадити набравши текст, якщо у вас багато переліків, як описано вище:
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();
}
}
Викликати .toUpperCase () або .toLowerCase () завжди легко, але повернення змішаного випадку може бути складним. Розглянемо колір "bleu de France". У Франції завжди з великої літери, тому ви можете додати метод textLower () до переліків, якщо ви стикаєтеся з цим. Якщо ви використовуєте цей текст на початку речення, порівняно з серединою речення, порівняно з заголовком, ви можете бачити, як один toString()
метод може бути невдалим. І це навіть не торкається символів, які є незаконними в ідентифікаторах Java, або які набирають біль, оскільки вони не представлені на стандартних клавіатурах, або символів, які не мають регістру (Kanji тощо).
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);
}
}
Правильно використовувати їх не так складно:
IllegalStateException(color1.textUcFirst() + " clashes horribly with " +
color2.textLc() + "!")
Сподіваємось, це також демонструє, чому використання значень перерахунків із змішаним регістром також розчарує вас. Однією з останніх причин дотримуватися всезаміщених знаків із підкресленнями констант перерахунку є те, що це дотримується принципу найменшого здивування. Люди очікують цього, тому, якщо ви робите щось інше, вам завжди доведеться пояснювати себе чи мати справу з людьми, які зловживають вашим кодом.