0
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);
    }
}

所以这种方法有效,但我仍然觉得它不优雅。

4

1 回答 1

0

为什么for在你的解决方案中使用?做就是了:

if (map.containsKey(element)) {
    map.get(element).invoke(tempFoo, tmpValue);
}
于 2013-09-22T13:16:01.207 回答