Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我是否应该重写Enum.toString()以本地化枚举的标签?_Java_Jsf_Localization - Fatal编程技术网

Java 我是否应该重写Enum.toString()以本地化枚举的标签?

Java 我是否应该重写Enum.toString()以本地化枚举的标签?,java,jsf,localization,Java,Jsf,Localization,今天,我有一个风格问题:给定以下代码,我应该重写EnumtoString以向应用程序用户提供本地化字符串,还是切换到自定义函数(如getLabel),还是有其他方法可以实现相同的效果 我主要是在这里保持干燥,所以硬编码资源包前缀不是一个选项 我有一个简单的枚举,如下所示: public enum DUE_DATE { START, PRESENTED; public String toString() { return DBResBundle.instance(

今天,我有一个风格问题:给定以下代码,我应该重写EnumtoString以向应用程序用户提供本地化字符串,还是切换到自定义函数(如getLabel),还是有其他方法可以实现相同的效果

我主要是在这里保持干燥,所以硬编码资源包前缀不是一个选项

我有一个简单的枚举,如下所示:

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之类的东西。