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);
}
}
Так что этот метод работает, но я до сих пор не считаю это элегантно.