Java 通过反射初始化字符串常量
我正在重构一些旧代码,并找到一个包含字符串常量的类“Tags”,其中大多数是一些XML解析器处理程序使用的标记。但也用于序列化数据。它们定义为空白: 公共静态字符串代理,名称,X,Y,键。。。代码 并以其自己的名称初始化: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
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);
}
}
}
在上面的代码中,没有必要使用testvalue.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()
是个好主意。