我有一个包含常量列表的类......
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”。
这样做有什么好的工具类吗?
答案 0 :(得分: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);
}
}
答案 1 :(得分:1)
如果可能(例如,您可以更改代码),请将这些常量更改为enum
。这样,您可以通过使每个枚举条目相关联的值轻松编写“反向查找”功能。
理论上,如果你有每个条目代表0..N的数字,你甚至可以使用条目的编号(由枚举给出),但这不是最佳实践。
由于你不能使用枚举,你可以通过反射破解它(警告,它很难看)。
Accessing Java static final ivar value through reflection
此线程有一些代码可以通过反射访问public static final
值。您可以使用Map来存储这种关系,实时查找,或尝试将其封装在Enum中,如Jon Skeet建议的那样,并从那时起使用该枚举(具有带来的所有优点)。