Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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_String_Reflection_Constants - Fatal编程技术网

Java 通过反射初始化字符串常量

Java 通过反射初始化字符串常量,java,string,reflection,constants,Java,String,Reflection,Constants,我正在重构一些旧代码,并找到一个包含字符串常量的类“Tags”,其中大多数是一些XML解析器处理程序使用的标记。但也用于序列化数据。它们定义为空白: 公共静态字符串代理,名称,X,Y,键。。。代码 并以其自己的名称初始化: static { Field[] fields = Tags.class.getFields(); for (int i = 0; i < fields.length; ++i) { try { // init f

我正在重构一些旧代码,并找到一个包含字符串常量的类“Tags”,其中大多数是一些XML解析器处理程序使用的标记。但也用于序列化数据。它们定义为空白:

公共静态字符串代理,名称,X,Y,键。。。代码

并以其自己的名称初始化:

static {
    Field[] fields = Tags.class.getFields();
    for (int i = 0; i < fields.length; ++i) {
        try {
            // init field by its lowercased name
            String value = fields[i].getName().toLowerCase();
            fields[i].set(null, value);
        } catch (Exception e) {
            // exception should not occur, because only strings over here.
            e.printStackTrace();
        }
    }
}
静态{
Field[]fields=Tags.class.getFields();
对于(int i=0;i
你认为这有意义吗? 优点:

  • 所有标签放在一个地方
  • 保证名称和值之间的一致性(无误输入)
  • 键入时支持IDE自动完成
缺点:

  • 不是真正的常量(不是最终的)
  • 可读性——只使用字符串文字“proxy”、“name”等会更简单
  • 反射初始化会消耗处理时间——延迟启动时间

所以--保留它还是重构它?

您可以用枚举替换这些常量,并且仍然保留您列出的优点:

public enum Tags {
    PROXY("proxy"), 
    NAME("name"), 
    X("x"), 
    Y("y");

    public final String value;

    private Tags(String value) {
        this.value = value;

        if (!value.equals(name().toLowerCase())) {
            throw new RuntimeException("Value and name do not match");
        }
    }

    public static void main(String[] args) {
        for (Tags tag : Tags.values()) {
            System.out.println(tag + "\t" + tag.value);
        }
    }
}
在上面的代码中,没有必要使用test
value.equals(name().toLowerCase())
,但您似乎担心键入错误

尝试以下方法:

enum Enum {
    PROXY, NAME, X, Y;
    public String toString() { 
        return name().toLowerCase();
    }
}
或者这个:

public enum Tags {
    proxy, name, x, y
}

我可能会尝试使用
enum
来进行此操作。这听起来很像enum值。为什么不想出一种方法来使用一个枚举,将这些作为它的值呢?谢谢,米哈伊尔!我将字符串转换为枚举。重载
toString()
是个好主意。