我在一个POJO对象中创建了一个saxparser对象和xml读取,该对象处理不同类型的xml文件,具体取决于调用者指定的内容
此POJO获取一个xml值,表示联系人姓名和ID列表,而另一个xml文件/值表示单个联系人实际详细信息,如电话号码,地址等。
我的问题更多关于我如何从以下代码中删除重复的代码:
public static List<ContactName> extractContactList(String xml, int type) {
mXMLdata = new StringReader(xml);
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser sp = factory.newSAXParser();
XMLReader xr = sp.getXMLReader();
if(type == XML_MODE_PARSE_CONTACT_DESC){
mContactDescHandler = new ContactDescXmlHandler();
xr.setContentHandler(mContactDescHandler);
xr.parse(new InputSource(mXMLdata));
return mContactDescHandler.getContactDesc();
return null;
} else if(type == XML_MODE_PARSE_CONTACT_LIST){
mContactListHandler = new ContactListXmlHandler();
xr.setContentHandler(mContactListHandler);
xr.parse(new InputSource(mXMLdata));
return mContactListHandler.getContactNameList();
}
正如您所看到的,我正在使用扩展“DefaultHandler
的两个不同的POJO,并且他们都使用我的XMLReader
进行setContentHandler
并解析。
是他们在java中返回一个通用List<>()
对象的一种方式,因为这两个处理程序返回给我不同的列表pojo或者我最好离开它有没有它是完全用不同的方法分离两个?
xr.setContentHandler(mContactDescHandler);
和
xr.parse(new InputSource(mXMLdata));
我绝对可以写一次,但我认为主要问题是返回类型。
提前欢呼
答案 0 :(得分:1)
我认为你的代码很好;您正在处理非类型化的XML数据流并从中创建不同的类型,因此需要一个非多态的switch / if语句。由于不同类型确实需要单独处理,因此该代码非常精细。只有将两种类型改为具有更通用的父类(如Kelsey Rider建议),您才能使代码更简洁。
如果这不是我的代码中的返回问题,我甚至不会尝试将其概括一下。
答案 1 :(得分:0)
清理代码,以便ContactDescXmlHandler和ContactListXmlHandler都实现公共接口或从公共祖先继承。这个接口/祖先应该有一个像getContacts()之类的成员函数。然后为Desc和List类重新定义getContacts()函数,以执行getContactDesc()或getContactNameList()的工作。然后,您的代码将清理为:
(ancestor/interface) mHandler;
switch(type)
{
case XML_MODE_PARSE_CONTACT_DESC: mHandler = new ContactDescXmlHandler(); break;
case XML_MODE_PARSE_CONTACT_LIST: mHandler = new ContactListXmlHandler(); break;
default: return null;
}
xr.setContentHandler(mHandler);
xr.parse(new InputSource(mXMLdata));
return mHandler.getContacts();