2015-08-27 23 views
5

In Java, devo impostare una classe POJO con valori. Tuttavia, per decidere quale funzione setter utilizzare, devo fare affidamento sulla condizione if. Il mio codice attuale è il seguente:Eliminazione di 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); 
} 

Questo è solo un esempio, ma ho 70+ tali proprietà da impostare. Il mio codice funziona, ma mi chiedo se sia il modo giusto di fare le cose?

AFAIK, tale codice è contrario alle migliori pratiche di codifica. Come possiamo ottimizzare questo codice in Java? Qual è la migliore pratica di Java per gestire tale codice?

+3

È possibile utilizzare la "casella degli interruttori"! –

+8

Se ho capito bene, il tuo codice sta essenzialmente de-serializzando i dati XML in un POJO manualmente, riga per riga, con una condizione per ogni nodo/proprietà. C'è molto più sbagliato in questo rispetto all'enorme if/else. Direi che è meglio trovare una struttura di serializzazione di alto livello come Jackson, e riscriverne la maggior parte. – Mena

+0

Se sta risolvendo il mio problema. Switch avrà lo stesso problema come se. Il codice sarà ancora brutto. –

risposta

5

In realtà è qualcosa che dovrebbe essere fatto automaticamente sulla base delle annotazioni da qualche biblioteca come Jackson 2.0+ o qualcosa di simile (sto parsing solo JSON finora)

Poi gli sguardi degli oggetti in questo modo:

@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

È possibile provare Java Architecture per XML Binding (JAXB), here si dispone di un tutorial. cioè:

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

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

Piuttosto che avere un campo separato e setter per ogni proprietà, creare un dizionario per contenere tutte le tue proprietà. Prendendo in prestito il codice da 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. 
} 

Ora tutto 70+ delle vostre proprietà hanno un solo getter e setter. Nessun gigante se-else o blocco interruttore.

Con un dizionario, si perdono alcuni dei contratti forniti dalle proprietà. Ad esempio, potrei aggiungere una proprietà al dizionario che non dovrebbe esistere. Puoi applicare queste restrizioni da solo (ad esempio, creando un elenco di nomi di proprietà consentiti e rifiutando di impostare qualsiasi proprietà che non è nell'elenco).