2015-08-27 5 views
5

В Java я должен установить класс POJO со значениями. Однако, чтобы решить, какую функцию сеттера использовать, я должен зависеть от состояния if. Мой текущий код выглядит следующим образом:Избавление от if/else

// Code written in a function which is called within a loop, while parsing xml file. 
if (name.equals("dim1")) { 
    line.setDim1Code(Integer.parseInt(value)); 
} else if (name.equals("dim2")) { 
    line.setDim2Code(Integer.parseInt(value)); 
} else if (name.equals("debitcredit")) { 
    line.setDebitOrCredit(value); 
} else if (name.equals("basevalue")) { 
    line.setBasevalue(Integer.parseInt(value)); 
} else if (name.equals("rate")) { 
    line.setRate(Integer.parseInt(value)); 
} else if (name.equals("value")) { 
    line.setValue(Integer.parseInt(value)); 
} else if (name.equals("description")) { 
    line.setDescription(value); 
} else if (name.equals("vatbasetotal")) { 
    line.setVatBaseTotal(value); 
} else if (name.equals("vattotal")) { 
    line.setVatTotal(value); 
} 

Это всего лишь пример, но у меня есть 70 таких свойств. Мой код работает, но мне интересно, правильно ли он это делает?

AFAIK, такой код противоречит наилучшим методам кодирования. Как мы можем оптимизировать этот код в Java? Что такое наилучшая практика Java для работы с таким кодом?

+3

Вы можете использовать 'switch case'! –

+8

Если я правильно понимаю, ваш код по существу де-сериализует XML-данные в POJO вручную, строка за строкой, с условием для каждого узла/свойства. В этом есть намного больше ошибок, чем просто огромное if/else. Я бы сказал, что вам лучше найти некоторые высокоуровневые схемы сериализации, такие как Jackson, и переписать их. – Mena

+0

Если это решение моей проблемы. У коммутатора будет такая же проблема, как если бы. Код по-прежнему выглядит уродливым. –

ответ

5

Это на самом деле то, что должно быть сделано автоматически на основе аннотаций некоторой библиотеки, как Джексон 2.0+ или что-то подобное (я разбор только JSON до сих пор)

Затем объект выглядит вот так:

@XmlAccessorType(XmlAccessType.FIELD) 
    public class Employee 
    { 
     @XmlAttribute 
     @XmlID 
     protected String id; 

     @XmlAttribute 
     protected String name; 

     @XmlIDREF 
     protected Employee manager; 

     @XmlElement(name="report") 
     @XmlIDREF 
     protected List<Employee> reports; 

     public Employee() { 
      reports = new ArrayList<Employee>(); 
     } 
    } 
0

Что вы, вероятно, хотите сделать, это написать динамический Getter/Setter. Быстрый поиск в Google даст вам множество вариантов и подходов, но вот пара, которую я нашел быстро.

How to define dynamic setter and getter using reflection?

Invoking setter method using java reflection

лично мне нравится внешний вид BeanUtils. Простой и понятный.

1

Вы можете попробовать Java Architecture для привязки XML (JAXB), here у вас есть учебник. т.е.

File file = new File("C:\\file.xml"); 
    JAXBContext jaxbContext = JAXBContext.newInstance(Pojo.class); 

    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
    Pojo pojo= (Pojo) jaxbUnmarshaller.unmarshal(file); 
0

Вместо того, чтобы иметь отдельное поле и сеттер для каждого свойства, создайте словарь для хранения всех ваших свойств. Заимствование код из How do you create a dictionary?:

private Map<String, String> properties; 

// Constructor 
public MyClass() { 
    properties = new HashMap<String, String>(); 
} 

// Setter 
public string setProperty(String name, String value) { 
    properties.put(name, value); 
} 

// Getter 
public string getProperty(String name) { 
    return properties.get(name); // May return null. You may want to handle that. 
} 

Теперь все 70+ ваших свойств имеют только один поглотитель и сеттер. Нет гигантского if-else или блока переключения.

Со словарем вы теряете некоторые контракты, которые предоставляют свойства. Например, я мог бы добавить свойство в словарь, который не должен существовать. Вы можете самостоятельно выполнить эти ограничения (например, создав список разрешенных имен свойств и отказавшись установить любое свойство, которого нет в списке).

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