Java 摆脱if/else

Java 摆脱if/else,java,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("dim

在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多个这样的属性要设置。我的代码正在运行,但我想知道这是否是正确的做法


抱歉,这样的代码违背了编码最佳实践。我们如何在Java中优化这段代码?Java处理此类代码的最佳实践是什么?

您可能希望做的是编写一个动态Getter/Setter。快速的谷歌搜索会给你提供大量的选择和方法,但这里有几个我很快就找到了


我个人喜欢小海狸的样子。简单易懂。

您可以尝试Java Architecture for XML Binding(JAXB),您有一个教程。 i、 e:


这实际上是一件事,应该根据一些库(如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>();
        }
    }
@xmlacessortype(xmlacesstype.FIELD)
公营雇员
{
@XmlAttribute
@XmlID
受保护的字符串id;
@XmlAttribute
受保护的字符串名称;
@XmlIDREF
受保护的员工经理;
@xmlement(name=“报告”)
@XmlIDREF
受保护名单报告;
公职人员(){
报告=新的ArrayList();
}
}

与其为每个属性创建单独的字段和setter,不如创建一个字典来保存所有属性。借用代码来源:

私有地图属性;
//建造师
公共MyClass(){
properties=newhashmap();
}
//塞特
公共字符串集合属性(字符串名称、字符串值){
properties.put(名称、值);
}
//吸气剂
公共字符串getProperty(字符串名称){
return properties.get(name);//可能返回null。您可能需要处理该问题。
}
现在,所有70+个属性只有一个getter和setter。没有巨人,如果其他或开关块


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

您可以使用
开关案例
!如果我理解正确的话,您的代码本质上是将XML数据逐行手动反序列化到POJO中,每个节点/属性都有一个条件。这不仅仅是一个巨大的if/else,还有更多的错误。我想说,你最好找一些像Jackson这样的高级序列化框架,然后重写它。如果它解决了我的问题。开关将出现与if相同的问题。代码看起来仍然很难看。你能详细说明一下,例如,setVatTotal()setVatBaseTotal()之间的区别吗?我认为如果您发布两个示例进行比较会很有帮助。这可能是一个愚蠢的问题,但是POJO对象可以有一个属性列表吗?我很难理解POJO是什么,但是一个70多项的键值对列表似乎可以解决这个问题。
@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>();
        }
    }
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.
}