摆脱if / else

时间:2015-08-27 13:36:51

标签: java

在Java中,我设置了一个带有值的POJO类。但是,要决定使用哪个setter函数,我必须依赖if条件。我目前的代码如下:

// 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最佳实践是什么?

4 个答案:

答案 0 :(得分:5)

它实际上是应该根据某些库(如Jackson 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>();
        }
    }

答案 1 :(得分:1)

您可以尝试Java Architecture for XML Binding(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);

答案 2 :(得分:0)

您可能要做的是编写动态Getter / Setter。快速谷歌搜索将为您提供大量选项和方法,但这里有一对我很快找到的。

How to define dynamic setter and getter using reflection?

Invoking setter method using java reflection

我个人喜欢 BeanUtils 的外观。简单易懂。

答案 3 :(得分:0)

不是为每个属性设置单独的字段和setter,而是创建一个字典来保存所有属性。借用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多个属性都只有一个getter和setter。没有巨大的if-else或切换块。

使用字典,您将丢失属性提供的一些合同。例如,我可以在不应该存在的字典中添加属性。您可以自己实施这些限制(例如,通过创建允许的属性名称列表并拒绝设置列表中没有的任何属性)。