2015-08-27 15 views
5

W Javie, muszę ustawić klasę POJO z wartościami. Jednak aby zdecydować, która funkcja ustawiająca będzie używana, muszę polegać na stanie if. Mój obecny kod wygląda następująco:Pozbywanie się 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); 
} 

To tylko przykład, ale mam już 70 takich właściwości do ustawienia. Mój kod działa, ale zastanawiam się, czy jest to właściwy sposób robienia rzeczy?

AFAIK, taki kod jest niezgodny z najlepszymi praktykami kodowania. Jak możemy zoptymalizować ten kod w Javie? Co to jest najlepsza praktyka Java, aby poradzić sobie z takim kodem?

+3

Możesz użyć 'przełączania obudowy'! –

+8

Jeśli dobrze rozumiem, twój kod jest w istocie serializowaniem danych XML w POJO ręcznie, linia po linii, z warunkiem dla każdego węzła/usługi. Jest o wiele więcej z tym nie tak, niż tylko ogromny, czy inny. Powiedziałbym, że lepiej jest znaleźć ramy do serializacji wysokiego poziomu, takie jak Jackson, i przerobić wiele z tego. – Mena

+0

Jeśli rozwiązuje mój problem. Switch będzie miał taki sam problem, jak w przypadku. Kod nadal będzie wyglądał brzydko. –

Odpowiedz

5

To jest rzeczywiście coś, co powinno być zrobione automatycznie na podstawie adnotacji przez niektóre biblioteki jak Jackson 2.0+ lub coś podobnego (mam tylko parsowania JSON do tej pory)

Następnie wygląd obiektu tak:

@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>(); 
     } 
    } 
1

Możesz wypróbować Architekturę Java dla powiązań XML (JAXB), here masz samouczek. tj:

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

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

Zamiast posiadania osobnego pola i setera dla każdej właściwości, utwórz słownik, w którym będą przechowywane wszystkie właściwości. Pożyczanie kod z 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. 
} 

Teraz 70+ swoich właściwości mają tylko jeden getter i setter. Nie ma gigantycznego bloku if-else lub switch.

W słowniku tracisz niektóre z umów dostarczanych przez właściwości. Na przykład mogę dodać właściwość do słownika, która nie powinna istnieć. Możesz wymusić te ograniczenia samodzielnie (na przykład tworząc listę dozwolonych nazw właściwości i odmawiając ustawienia dowolnej właściwości, której nie ma na liście).

Powiązane problemy