2015-08-27 15 views
5

In Java muss ich eine POJO-Klasse mit Werten festlegen. Um jedoch zu entscheiden, welche Setter-Funktion verwendet werden soll, muss ich mich auf if Bedingung verlassen. Mein aktueller Code sieht wie folgt aus:loswerden von 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); 
} 

Dies ist nur ein Beispiel, aber ich habe 70+ solche Eigenschaften eingestellt werden. Mein Code funktioniert, aber ich frage mich, ob es richtig ist, Dinge zu tun?

AFAIK, ist ein solcher Code gegen die Best Practices der Codierung. Wie können wir diesen Code in Java optimieren? Was ist Java-Best Practice, um mit einem solchen Code umzugehen?

+3

Sie können den 'switch case' verwenden! –

+8

Wenn ich richtig verstehe, dein Code ist im Wesentlichen De-Serialisierung von XML-Daten in ein POJO manuell Zeile für Zeile mit einer Bedingung für jeden Knoten/Eigenschaft. Damit ist viel mehr falsch als nur das große if/else. Ich würde sagen, Sie sind besser dran, ein High-Level-Framework für die Serialisierung wie Jackson zu finden und das Ganze neu zu schreiben. – Mena

+0

Wenn das mein Problem löst. Switch wird das gleiche Problem haben wie wenn. Code wird immer noch hässlich aussehen. –

Antwort

5

Es tatsächlich etwas ist, das durch eine Bibliothek auf Annotationen automatisch basierend wie Jackson getan werden sollte 2.0+ oder etwas ähnliches (ich bin Parsen bisher nur JSON)

das Objekt sieht dann wie folgt:

@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

Sie können versuchen Java-Architektur für XML-Bindung (JAXB), here Sie haben ein Tutorial. dh:

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

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

Anstatt für jede Eigenschaft ein separates Feld und Setter zu erstellen, erstellen Sie ein Wörterbuch für alle Ihre Eigenschaften. Leihen Code aus 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. 
} 

Nun sind alle 70+ Ihrer Eigenschaften nur einen Getter und Setter haben. Kein riesiger if-else oder Wechselblock.

Mit einem Wörterbuch verlieren Sie einige der Verträge, die Eigenschaften bereitstellen. Zum Beispiel könnte ich dem Wörterbuch eine Eigenschaft hinzufügen, die nicht existieren sollte. Sie können diese Einschränkungen selbst erzwingen (z. B. indem Sie eine Liste zulässiger Eigenschaftsnamen erstellen und das Festlegen einer Eigenschaft verweigern, die nicht in der Liste enthalten ist).