2012-08-01 42 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; 
    } 
} 
} 

這將讓你的枚舉,你的國際化目標獨立和明確的。