我在班级Clazz上有一个enum FooBar,有这样的FOO和BAR:
class Clazz {
enum FooBar{
FOO,
BAR
}
}
我现在想使用wicket getString()
方法来定位值FOO
和BAR
。我能做的最好的事情是在i18n文件中定义
Clazz.FooBar.FOO=foo
Clazz.FooBar.BAR=bar
我使用此代码获取值
fooBar = FooBar.FOO;
getString("Clazz.FooBar." + fooBar.name());
我听说这可以在没有Clazz.FooBar
i18n查询字符串的情况下实现,但要调用的方法会有所不同。怎么做?
答案 0 :(得分:1)
您可以将此方法放在基页/面板中:
public String getString(Enum<?> value) {
Class<?> enclosingClass = value.getClass().getEnclosingClass();
String key = (enclosingClass == null ? "" : enclosingClass.getSimpleName() + ".")
+ value.getClass().getSimpleName() + "." + value.name();
return getString(key);
}
然后你可以用
简单地调用它getString(Clazz.FooBar.FOO);
它将返回您在属性文件中定义的内容。
答案 1 :(得分:1)
我不建议你直接在属性文件中存储枚举常量名称,原因很简单,两个不同的枚举可以保持同名。
以下是我提出的代码
class Clazz {
enum FooBar {
//StrId are keys from property file e.g. below
FOO("com.abc.classz.foobar.FOO"), BAR("com.abc.classz.foobar.BAR");
private final String strId;
private FooBar(String id) {
this.strId = id;
}
// toString can also be used here I am just keen on having seperate
// method
public String getName() {
//Load Value for strId from properties file
return null;
}
}
}
这将使您的枚举和您的i18n目的分开且清晰。
答案 2 :(得分:0)
见下面的Enum类示例。您可能希望根据需要对其进行更多自定义。
public enum FooBar {
foo("foobar.foo"),
bar("foobar.bar");
private String key;
ErrorCodeEnum(final String key) {
this.key = key;
}
public String toString() {
return key;
}
}
然后你可以让toString方法直接返回键,这样你就可以使用
getString(ErrorCodeEnum.ERROR1);
或者您可以直接覆盖toString方法,如下所示
public enum FooBar {
foo, bar;
public String toString(){
return getClass().getName()+"."+name();
}
}
答案 3 :(得分:0)
你可以简单地定义
FOO=foo
BAR=bar
在您的媒体资源中并通过
访问它getString(fooBar.name());
还是我错过了一些观点?
答案 4 :(得分:0)
我正在寻找名为EnumChoiceRenderer
的东西。主要思想是给出一个EnumChoiceRenderer,例如: DropDownChoise元素,你能够提供我在我的问题中提出的那种参数。好的,在这个解决方案中,你只能给出
FooBar.BAR=bar
FooBar.FOO=foo
在您的资源文件中,但这是我在业余时间对此进行更多调查时能找到的最接近的。
PS。单击本答案开头的EnumChoiseRenderer,查看此解决方案的文章。