我有一个常量列表类...反向常量查找
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类?
我有一个常量列表类...反向常量查找
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类?
我建议使用枚举而不是常量来开始 - 然后您可以在枚举中建立反向映射。
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);
}
}
第三方库:-( – 2012-03-28 10:06:47
嘎!被Jon Skeet殴打不到一分钟... – pcalcao 2012-03-28 10:06:49
@DD:如果你之前这么说过,会有所帮助,我仍然会在你的代码中构建枚举,并使用第三方常量来提供文本值...然后在代码中的任何地方使用枚举,这也会给你更多的类型安全性 – 2012-03-28 10:08:43
如果可能的话(如,你被允许更改代码),改变这些常数为enum
。这样,您可以通过将每个枚举条目的值关联起来,轻松编写“反向查找”功能。从理论上讲,如果每个条目都代表0..N的数字,那么甚至可以使用条目的数字(它由枚举给出),但这不完全是最佳实践。
既然你不能使用枚举,你可以通过反射破解它(警告,它很难)。
Accessing Java static final ivar value through reflection
这个讨论有一些代码,与反射访问public static final
值。您可以使用Map来存储这种关系,实时查看它,或者尝试将它封装在一个Enum中,像Jon Skeet所建议的那样,然后使用该枚举(带来所有优点)。
第三方库...不能这样做 – 2012-03-28 10:07:28
我的编辑帮助? – pcalcao 2012-03-28 10:28:32
我有点猜测有一些Apache的反射库,可能有助于这一点。 – 2012-03-28 10:07:46