2012-03-28 54 views
-1

我有一個常量列表類...反向常量查找

public static final java.lang.String HEARTBEAT = "0"; 
    public static final java.lang.String TEST_REQUEST = "1"; 
    public static final java.lang.String RESEND_REQUEST = "2"; 

我想從「0」去 - >「HEARBEAT」不知何故。

這樣做的任何好的util類?

+0

我有點猜測有一些Apache的反射庫,可能有助於這一點。 – 2012-03-28 10:07:46

回答

1

我建議使用枚舉而不是常量來開始 - 然後您可以在枚舉中建立反向映射。

public enum RequestType { 
    HEARTBEAT("0"), 
    TEST_REQUEST("1"), 
    RESEND_REQUEST("2"); 

    private final String text; 
    private static final Map<String, RequestType> reverseLookup; 

    static { 
     // Or use an immutable map from Guava, etc. 
     reverseLookup = new HashMap<String, RequestType>(); 
     for (RequestType type : EnumSet.allOf(RequestType.class)) { 
      reverseLookup.put(type.text, type); 
     } 
    } 

    private RequestType(String text) { 
     this.text = text; 
    } 

    public String getText() { 
     return text; 
    } 

    public static RequestType getType(String text) { 
     return reverseLookup.get(text); 
    } 
} 
+0

第三方庫:-( – 2012-03-28 10:06:47

+0

嘎!被Jon Skeet毆打不到一分鐘... – pcalcao 2012-03-28 10:06:49

+0

@DD:如果你之前這麼說過,會有所幫助,我仍然會在你的代碼中構建枚舉,並使用第三方常量來提供文本值...然後在代碼中的任何地方使用枚舉,這也會給你更多的類型安全性 – 2012-03-28 10:08:43

1

如果可能的話(如,你被允許更改代碼),改變這些常數爲enum。這樣,您可以通過將每個枚舉條目的值關聯起來,輕鬆編寫「反向查找」功能。從理論上講,如果每個條目都代表0..N的數字,那麼甚至可以使用條目的數字(它由枚舉給出),但這不完全是最佳實踐。

既然你不能使用枚舉,你可以通過反射破解它(警告,它很難)。

Accessing Java static final ivar value through reflection

這個討論有一些代碼,與反射訪問public static final值。您可以使用Map來存儲這種關係,實時查看它,或者嘗試將它封裝在一個Enum中,像Jon Skeet所建議的那樣,然後使用該枚舉(帶來所有優點)。

+0

第三方庫...不能這樣做 – 2012-03-28 10:07:28

+0

我的編輯幫助? – pcalcao 2012-03-28 10:28:32