2010-10-11 92 views
1

我创建了处理不同类型的XML文件根据呼叫者指定的内容的帮助摆脱重复的代码?

这个POJO获取表示联系人姓名和身份证的,而列表的XML值的POJO对象中读取Java中的SAXParser的对象和XML其他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(); 
      } 

正如你所看到的我正在使用两个不同的POJO'S d“DefaultHandler,它们都使用我的XMLReader来做setContentHandler并解析。

是他们在java中的一种方式返回一个通用的List<>()对象作为两个处理程序返回我不同的列表pojo的或我最好离开它有它是或分开两个完全在不同的方法吗?

xr.setContentHandler(mContactDescHandler);xr.parse(new InputSource(mXMLdata));我绝对可以写一次,但我认为主要问题是返回类型。

欢呼提前

+0

您在if语句的第一个分支中有两个return语句。 – 2010-10-11 14:59:15

+0

它在我看来,真正的问题是如何返回列表 *或*列表(或其他)。这是一个正确的结论吗? – 2010-10-11 17:32:00

回答

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(); 
+0

请注意他的返回语句之间的区别,您需要另一个开关或if语句,如果您想要这样重构。 – Jorn 2010-10-11 15:27:01

+0

嗯,也许我还不够清楚...编辑解释更好。 – Kricket 2010-10-11 15:42:46

1

我认为你的代码是好的;你正在处理一个无类型的XML数据流,并且正在创建不同类型的数据流,因此不会出现多态的switch/if语句。由于不同类型需要单独处理,因此此代码非常好。只有当这两种类型可以更改为具有更通用的父类(如Kelsey Rider所建议的)时,才可以使代码更简洁一些。

如果这不是我的代码中的返回问题,我甚至不会尝试将其推广一会儿。

+0

那么是否有可能创建一个扩展另一个超类的接口? – jonney 2010-10-12 08:24:28

+0

类似于公共接口Contacts DefaulHandler {} – jonney 2010-10-12 08:24:58

+0

我可以做类似这样的事情并创建一个成员函数,它返回List对象 – jonney 2010-10-12 08:26:18