我正在重构一些旧代码并找到一个包含字符串常量的类“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();
}
}
}
你认为这有意义吗? 优点:
缺点:
那么 - 保留它还是重构它?
答案 0 :(得分: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())
不是必需的,但您似乎担心错误输入错误
答案 1 :(得分:3)
试试这个:
enum Enum {
PROXY, NAME, X, Y;
public String toString() {
return name().toLowerCase();
}
}
或者这个:
public enum Tags {
proxy, name, x, y
}