2012-08-01 69 views
1

我有类clazz所枚举FooBar的与falues Foo和Bar这样的:枚举值在国际检票

class Clazz { 
    enum FooBar{ 
     FOO, 
     BAR 
    } 
} 

我现在想用检票getString()方法来定位值FOOBAR。我能做的最好的是在国际化的文件

Clazz.FooBar.FOO=foo 
Clazz.FooBar.BAR=bar 

定义和我得到的值与此代码

fooBar = FooBar.FOO; 
getString("Clazz.FooBar." + fooBar.name()); 

我听说,这可能不Clazz.FooBar除了国际化的查询字符串来实现,但要调用的方法会有所不同。这个怎么做?

+0

有没有你不喜欢我的答案的原因?如果我没有误解任何东西,我认为它直接回答你的问题。 – 2012-08-15 07:21:18

+0

其实,我在某种程度上错过了答案的要点,同时更接近我预先定义的这个应该如何工作的观点。你的答案是代码明智的最好的。我会接受它,因为那样我不得不减少代码更改。 (给每个枚举添加东西并不是一个好主意,尽管在这么多答案中给出了。) – mico 2012-08-15 07:35:22

回答

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); 

调用它,它会回报你的属性文件中定义的内容。

0

请参阅下面的示例枚举类。您可能需要根据您的需求更多地进行定制。

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(); 
    } 
    } 
+0

感谢您的快速回答!不过,我仍然在等待一些更具体的检票,并且我不需要触摸枚举类。想法,任何人? – mico 2012-08-01 12:24:35

0

你可以简单地定义

FOO=foo 
BAR=bar 

在您的财产,并通过访问它

getString(fooBar.name()); 

或我错过了一些观点?

+0

如果例如两个枚举在这两个枚举中都有FOO或BAR,那么将整个路径放在那里会更好。它使用完整的方法路径(org.my.company.and.what.ever.else.Clazz.FooBar.FOO = foo),然后得到'getString(fooBar.getCanonicalName);'但我不喜欢这么长的名字在道具文件。这就是为什么我想要那三部分。 – mico 2012-08-01 17:52:07

+0

在这种情况下,您可以创建一个''IStringResourceLoader',将'foobar.getCannonicalName()'映射到'Clazz.FooBar.FOO' ... – Nicktar 2012-08-01 20:26:19

0

我正在寻找一种叫EnumChoiceRenderer的东西。主要想法是为例如EnumChoiceRenderer DropDownChoise元素,你可以给我的问题提出的那种参数。好吧,在这个解决方案你能只给

 FooBar.BAR=bar 
    FooBar.FOO=foo 

在您的资源文件,但这个时候我调查了这多与我的业余时间,我能找到最接近的一次。

PS。单击此答案开头的EnumChoiseRenderer以查看该解决方案的文章。

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; 
    } 
} 
} 

这将让你的枚举,你的国际化目标独立和明确的。