Java 摆脱if/else
在Java中,我必须用值设置一个POJO类。然而,要决定使用哪个setter函数,我必须依赖于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
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.
}