gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:44:32 25 4
gpt4 key购买 nike

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

public static String PROXY, NAME, X, Y, KEY, ... CODES;

并用自己的名称初始化:

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”等会更简单
  • 通过反射进行初始化会消耗处理时间——延迟启动时间

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

最佳答案

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

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()) 不是必需的,但您似乎担心输入错误

关于java - 通过反射初始化字符串常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17175872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com