Java 我是否应该重写Enum.toString()以本地化枚举的标签?
今天,我有一个风格问题:给定以下代码,我应该重写EnumtoString以向应用程序用户提供本地化字符串,还是切换到自定义函数(如getLabel),还是有其他方法可以实现相同的效果 我主要是在这里保持干燥,所以硬编码资源包前缀不是一个选项 我有一个简单的枚举,如下所示:Java 我是否应该重写Enum.toString()以本地化枚举的标签?,java,jsf,localization,Java,Jsf,Localization,今天,我有一个风格问题:给定以下代码,我应该重写EnumtoString以向应用程序用户提供本地化字符串,还是切换到自定义函数(如getLabel),还是有其他方法可以实现相同的效果 我主要是在这里保持干燥,所以硬编码资源包前缀不是一个选项 我有一个简单的枚举,如下所示: public enum DUE_DATE { START, PRESENTED; public String toString() { return DBResBundle.instance(
public enum DUE_DATE {
START,
PRESENTED;
public String toString() {
return DBResBundle.instance().getString("due_date_lbl_" + name());
}
}
其中DBResBundle是我的ResourceBundle实现,我可以在JSF中作为msg访问,如下所示:
<h:selectOneMenu value="#{m.due_date}" id="due">
<f:selectItems value="#{dueDates}" var="d"
itemLabel="#{msg['due_date_lbl_'.concat(d.name())]}" />
</h:selectOneMenu>
我还在代码中使用enum,不仅仅是JSF上下文,而且我没有在那里使用toString。我在所有enum上都使用了一个方法getMsgKey,基本上可以
return getClass().getSimpleName() + "_" + name();
这与EnumTranslator类似,但没有EnumTranslator。toString在哪里可以找到用于检索适当本地化消息的区域设置?我选择getLabel,因为在这种情况下它可以更好地表示其语义。toString的语义并未真正定义,它的大部分用途是用于调试。@JBNizet它当前正在从JSF的viewRoot获取区域设置。这无疑是一个糟糕的设计,并将返回到当前登录用户的存储区域设置(我在别处可以找到)。@HannoBinder是的,引发这个问题的原因是EnumtoString的JavaDoc说它的输出应该是程序员可读的,而不是最终用户可读的。对。这就是为什么人们会期待这样的结局。因此,好的风格是不要在UI中使用toString之类的东西。