class Foo {
String member1;
String member2;
// Getters and Setters
...
}
class XmlDao extends Default Handler{
List<Foo> foos;
Foo tempFoo;
String tempValue;
...
@Override
public void characters(char[] ac, int i, int j) throws SAXException {
tempValue = new String(ac, i, j);
}
@Override
public void endElement(String s, String s1, String element) throws SAXException {
...
if (element.equalsIgnoreCase("member1")) {
tempFoo.setMember1(tmpValue);
}
if (element.equalsIgnoreCase("member2")) {
tempFoo.setMember2(tmpValue);
}
....
}
}
这里的问题是,对于我添加到模型 Foo 的任何成员变量,我还必须进入 DAO 并添加
if (element.equalsIgnoreCase("member1")) {
tempFoo.setMember1(tmpValue);
}
对其public void endElement
。我意识到我可以switch
,但问题是相同的。处理这个问题的最佳方法是什么?理想情况下,我宁愿在一次课堂上写一次。在对这个问题进行了一些搜索后,我遇到了Reflection
。这让我可以写两次,但在一个类中,而不是两个类:
在我的模型 Foo 中,我添加了以下静态方法:
public static Map<String, Method> getMap() throws NoSuchMethodException, SecurityException {
Map<String, Method> map = new HashMap<String,Method>();
map.put("member1", Foo.class.getMethod("setMember1", String.class));
map.put("member2", Foo.class.getMethod("setMember2", String.class));
return map;
}
在我的 XmlDao 中,我在其构造函数中添加了一个Map<String, Method> map
, 和一个调用。Foo.getMap()
我还去掉了方法中的if
/switch
语句,并在该endElement
方法中添加了以下内容:
for (Entry<String, Method> entry : map.entrySet()) {
if (element.equalsIgnoreCase(entry.getKey())) {
entry.getValue().invoke(tempFoo, tmpValue);
}
}
所以这种方法有效,但我仍然觉得它不优雅。