我有一個常量列表類...反向常量查找
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