反向常量查找

时间:2012-03-28 10:02:56

标签: 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”开始 - >不知怎的,“HEARBEAT”。

这样做有什么好的工具类吗?

2 个答案:

答案 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建议的那样,并从那时起使用该枚举(具有带来的所有优点)。