Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 反向常数查找_Java_Constants_Lookup - Fatal编程技术网

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:你是说数百个值吗?只需编写一个工具来自动生成枚举类。这不会花很长时间,而且比在任何地方都使用这些值要好得多。