在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最佳实践是什么?
答案 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或切换块。
使用字典,您将丢失属性提供的一些合同。例如,我可以在不应该存在的字典中添加属性。您可以自己实施这些限制(例如,通过创建允许的属性名称列表并拒绝设置列表中没有的任何属性)。