所以我正在处理一个现有的项目,我试图重构它。它使用XML,当前代码如下所示:
有一个类用于生成XML:
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import hr.pbz.jhex.engine.xml.XmlMarshaller;
@XmlRootElement(name = "root")
public class MyXmlClass extends XmlMarshaller{
private String string1;
private String string2;
public String getString1() {
return string1;
}
@XmlAttribute
public void setString1(String string1) {
this.string1 = string1;
}
public String getString2() {
return string2;
}
@XmlAttribute
public void setString2(String string2) {
this.string2 = string2;
}
}
它在Main.java中使用
MyXmlClass myXml = new MyXmlClass()
myXml.setString1("foo");
myXml.SetString2("bar");
这就像它应该的那样,并产生良好的效果。
问题在于,在我的实际代码中,除了string1,string2之外还有更多的字段,而只是设置XML会使用很多行代码。
我的问题是,我可以在MyXmlClass中使用构造函数吗?类似的东西:
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import hr.pbz.jhex.engine.xml.XmlMarshaller;
@XmlRootElement(name = "root")
public class MyXmlClass extends XmlMarshaller{
private String string1;
private String string2;
public MyXmlClass() { //doesn't work without the default noargs constructor
}
public MyXmlClass(String string1, String string2) {
this.string1 = string1;
this.string2 = string2;
}
public String getString1() {
return string1;
}
@XmlAttribute
public void setString1(String string1) {
this.string1 = string1;
}
public String getString2() {
return string2;
}
@XmlAttribute
public void setString2(String string2) {
this.string2 = string2;
}
}
然后在Main.java中使用它,如:
MyXmlClass myXml = new MyXmlClass("foo", "bar");
我试过了,它产生了混合的结果。有时它会像它应该的那样工作,而在其他地方则不那么多。
=== EDIT ===
应该更清楚地了解'不要那么多'部分,这是一个例子。
让我们说现在我正在使用超过2个字段的XmlClass,比方说4。
我首先实例化它提供2个这样的参数:
MyXmlClass myXml = new MyXmlClass("foo", "bar");
然后我决定使用setter设置第三和第四个字段。
myXml.setElement3("set after instantiating");
myXml.setElement4("also after instantiating");
如果按此顺序执行,xml不包含我设置的调用setElement4的元素。如果我换掉他们的地方,就像这样:
myXml.setElement4("also after instantiating");
myXml.setElement3("set after instantiating");
它工作正常,所有元素都显示出来。我正在使用的课程非常大,所以需要一些时间为这个帖子设置一个MCVE,但我会尝试一下。发布这个只是为了看看这是否有效,或者我做了一些真正不应该做的hacky事情,这就是为什么程序在某些情况下表现得很奇怪。
=== EDIT ===
使用构造函数这样做是否安全?感谢。