我在解析XML元素时创建了一个辅助类,因此开发人员不需要知道XML字段的确切名称和大小写。
private static class TagNames{
public static String RESOURCE_ID = "ResourceId";
public static String RESOURCE_NAME = "ResourceName";
public static String RESOURCE_PRICE = "ResourcePrice";
}
这样可以更轻松地执行以下操作:
someXMLParser.getValueByTagName(TagNames.RESOURCE_ID);
我的问题是这个。如果我想迭代类TagNames中声明的所有字段,我该怎么做?伪代码:
For tag in TagNames:
someXMLParser.getValueByTagName(tag)
我知道我可能要重组所有这些。但我无法找到一种方法,使名称易于访问和迭代,没有任何重复。
有什么建议吗?
答案 0 :(得分:2)
你真的要求基于reflection的解决方案,但我认为在这种情况下Java Enum可能是更好的选择。建立在Frederick's example:
public class EnumTest {
public enum Tags {
RESOURCE_ID("ResourceId"),
REOURCE_NAME("ResourceName"),
RESOURCE_PRICE("ResourcePrice");
private final String tagName;
Tags(String tagName) {
this.tagName = tagName;
}
public String getTagName() {
return tagName;
}
}
public static void main(String[] args) {
for(Tags tag : Tags.values()) {
System.out.println("const:" + tag.name()
+ " tagName:" + tag.getTagName());
}
// API user might do e.g.:
// document.getValueForTag(Tags.REOURCE_NAME);
}
}
答案 1 :(得分:1)
您可能需要考虑使用ResourceBundle而不是类来存储标记名称。可能需要对代码进行一些修改,但与现在的操作相比,生成标记列表会更容易,添加新标记除了在属性文件中添加一行之外不需要太多工作。
答案 2 :(得分:1)
虽然我同意您应该使用枚举或ResourceBundles,但这是您实际问题的解决方案。一种生成地图名称的方法 - >来自给定类中所有公共常量的值(唯一缺少的应该是try
/ catch
或throws
)
public static Map<String, Object> getConstantValues(Class<?> clazz){
Map<String, Object> constantValues = new LinkedHashMap<String, Object>();
for(Field field : clazz.getDeclaredFields()){
int modifiers = field.getModifiers();
if(Modifiers.isPublic(mod)
&& Modifiers.isStatic(mod) && Modifiers.isFinal(mod)){
constantValues.put(field.getName(), field.get(null));
}
}
return constantValues;
}
答案 3 :(得分:0)
您可以使用枚举和附带的数组轻松完成此操作:
public class Main {
public enum TagName { RESOURCE_ID, REOURCE_NAME, RESOURCE_PRICE }
private static String[] tags = {"ResourceID", "ResourceName", "ResourcePrice"};
public static String getValueByTagName(TagName tag) {
return tags[tag.ordinal()];
}
public static void main(String[] args) {
System.out.println("Calling by getValueByTagName:");
System.out.println(getValueByTagName(TagName.RESOURCE_ID));
System.out.println("Calling TagName.values() for loop:");
for (TagName t : TagName.values()) {
System.out.println(getValueByTagName(t));
}
}
}
答案 4 :(得分:0)
使用枚举是一个很好的选择,特别是如果你使用自定义构造函数和内置的“值”方法:
public class Main {
public static enum TagName {
RESOURCE_ID("ResourceId"),
RESOURCE_NAME("ResourceName"),
RESOURCE_PRICE("ResourcePrice"),
;
private String s;
private TagName(String s) { this.s = s; }
public String toString() { return this.s; }
public static String[] strings() {
List<String> ss = new ArrayList<String>();
for (TagName tagName : TagName.values()) {
ss.add(tagName.toString());
}
return ss.toArray(new String[ss.size()]);
}
}
public static void main(String[] args) {
// Use TagName.values() for the enums, or for strings...
for (String s : TagName.strings()) {
System.out.println(s);
}
}
}
通过这种方式,您可以简单地添加新标签,它们将自动被“字符串”方法拾取;为了获得额外的性能,您可以静态地计算一次该字符串数组,因为您无法动态更改枚举集。你可以通过自动生成标记字符串的常量值来获得更好的,如果它们真的被标准化了......