2012-03-28 63 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