帮助摆脱重复的代码?

时间:2010-10-11 14:52:32

标签: java xml

我在一个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));我绝对可以写一次,但我认为主要问题是返回类型。

提前欢呼

2 个答案:

答案 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();