Java 反向常数查找
我有一个包含常量列表的类Java 反向常数查找,java,constants,lookup,Java,Constants,Lookup,我有一个包含常量列表的类 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开始 有什么好的util类可以这样做吗?我建议首先使用枚举而不是常量,然后可以在枚举中建立反向映射 p
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开始
有什么好的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);
}
}
如果有可能,如中所示,您可以更改代码,将这些常量更改为枚举。通过这种方式,您可以通过将值与每个枚举项关联,轻松地编写反向查找函数 理论上,如果每个条目都表示0..N中的一个数字,那么甚至可以使用枚举给出的条目编号,但这并不是最佳做法 因为您不能使用枚举,所以可以通过反射警告对其进行攻击,这很麻烦
这个线程有一些代码可以通过反射访问公共静态最终值。您可以使用映射来存储此关系,实时查找它,或者尝试将其封装到枚举中,就像Jon Skeet建议的那样,从那时起,使用该枚举将带来所有好处。第三方库…无法做到这一点。我猜有一些apache反射库可能会对此有所帮助。@DD:如果你以前这么说的话,它会有所帮助。我仍然会在代码中构建枚举,并使用第三方常量提供文本值。。。然后在代码中的任何地方使用枚举。这也会给你更多的类型安全性。不太实用…很多类都有数百个枚举这是FIX financial exchange规范…请看@DD:你是说数百个值吗?只需编写一个工具来自动生成枚举类。这不会花很长时间,而且比在任何地方都使用这些值要好得多。