2

我正在重构一些旧代码并找到一个包含字符串常量的类“标签”,其中大多数标签被一些 XML-Parser-Handlers 使用。但也用于序列化数据。它们被定义为空白:

公共静态字符串代理,名称,X,Y,KEY,...代码;

并用他们自己的名字初始化:

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();
        }
    }
}

你认为这有意义吗?优点:

  • 所有标签都在一个地方
  • 保证名称和值之间的对应关系(没有错误输入)
  • 输入时 IDE 自动完成支持

缺点:

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

那么——保留它还是重构它?

4

2 回答 2

4

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

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);
        }
    }
}

在上面的代码中,测试value.equals(name().toLowerCase())不是必需的,但您似乎担心输入错误

于 2013-06-18T18:35:38.030 回答
3

尝试这个:

enum Enum {
    PROXY, NAME, X, Y;
    public String toString() { 
        return name().toLowerCase();
    }
}

或这个:

public enum Tags {
    proxy, name, x, y
}
于 2013-06-18T18:51:40.700 回答