Отправляя перечисления между моим Java-кодом и базой данных или клиентским приложением, я часто заканчиваю тем, что читаю и записываю значения перечисления в виде строк. 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, или которые неудобно набирать, потому что они не представлены на стандартных клавиатурах, или символы, которые не имеют регистра (кандзи и т. Д.).
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() + "!")
Надеюсь, это также демонстрирует, почему использование перечислимых значений в смешанном регистре также разочарует вас. Одна из последних причин использовать заглавные буквы с подчеркивающими константами - это следовать принципу наименьшего удивления. Люди ожидают этого, поэтому, если вы делаете что-то другое, вам всегда придется объяснять себя или иметь дело с людьми, злоупотребляющими вашим кодом.