2010-10-11 17 views
1

я создал объект SAXParser и XML читать в Java внутри объекта POJO, который обрабатывает различные типы XML-файлы в зависимости от того, что абонент уточнимпомочь избавиться от дублированного кода?

это POJO получает значение 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

У вас есть два оператора return в вашей первой ветви оператора if. –

+0

Мне кажется, что реальный вопрос заключается в том, как вернуть что-то из списка * или * Список (или что-то еще). Это правильный вывод? – 2010-10-11 17:32:00

ответ

0

очистить код так, чтобы ContactDescXmlHandler и ContactListXmlHandler как реализовать общий интерфейс или наследовать от общего предка. Этот интерфейс/предок должен иметь функцию-член, такую ​​как getContacts() или что-то еще. Затем функция getContacts() переопределяется для классов Desc и List для выполнения работы 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

+0

Хм, может быть, я не был достаточно ясен ... отредактировал, чтобы объяснить лучше. – Kricket

1

Я думаю, что ваш код в порядке; вы обрабатываете нетипизированный поток данных XML и создаете из него разные типы, поэтому не следует ожидать не полиморфного оператора switch/if. Поскольку разные типы требуют отдельной обработки, этот код отлично подходит. Только если два типа могут быть изменены на более общий родительский класс (например, Kelsey Rider), вы можете сделать код немного более кратким.

Если это не проблема возврата в моем коде, я бы даже не попытался обобщить ее на мгновение.

+0

Так можно ли создать интерфейс, который расширяет еще один суперкласс? – jonney

+0

что-то вроде публичного интерфейса Контакты extends DefaulHandler {} – jonney

+0

Я мог бы сделать что-то подобное и создать функцию-член, которая возвращает мне объект List – jonney

Смежные вопросы