2010-10-11 142 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