2013-09-20 4 views
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 и добавитьМинимизация Repition Кодекса с использованием SAX в Java

 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 я добавил a 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); 
    } 
} 

Так что этот метод работает, но я до сих пор не считаю это элегантно.

ответ

0

Зачем использовать for в вашем решении? Только:

if (map.containsKey(element)) { 
    map.get(element).invoke(tempFoo, tmpValue); 
}