在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()总是很容易,但是要恢复混合大小写可能会很棘手。考虑一下颜色“法国蓝”。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() + "!")
希望这也说明了为什么使用大小写混合的枚举值也会令您失望。保持所有大写字母都带有下划线的枚举常量的最后一个原因是遵循最小惊讶原则。人们期望如此,因此,如果您做不同的事情,您总是必须要自我解释,或者与滥用代码的人打交道。