, поэтому я работаю над существующим проектом и пытаюсь его реорганизовать. Он использует 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");
Это работает так, как должно, и дает хорошие результаты.
Проблема в том, что в моих реальных кодах гораздо больше полей, чем просто строка1, строка2, а простая настройка 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");
Я пробовал это, и это дает смешанные результаты. Иногда это работает так, как должно, а в других местах не так много.
=== РЕДАКТИРОВАТЬ ===
Должен был быть яснее в части "не так много", вот пример.
Допустим, что сейчас я работаю с классом XmlClass с более чем двумя полями, скажем, 4.
Сначала я создаю его экземпляр, предоставляя 2 параметра:
MyXmlClass myXml = new MyXmlClass("foo", "bar");
Затем я решаю установить третье и четвертое поля, используя сеттеры.
myXml.setElement3("set after instantiating");
myXml.setElement4("also after instantiating");
Если я делаю это в таком порядке, xml не содержит элемент, который я установил, вызывая setElement4. Если я поменяюсь местами, вот так:
myXml.setElement4("also after instantiating");
myXml.setElement3("set after instantiating");
работает правильно, и все элементы отображаются. Классы, с которыми я работаю, довольно большие, так что потребуется настройка MCVE для этого потока, но я попробую. Отправляя это, просто чтобы посмотреть, действительно ли это даже допустимо, или я делаю какие-то хакерские вещи, которые действительно не следует делать, и именно поэтому программа в некоторых случаях ведет себя странно.
=== РЕДАКТИРОВАТЬ ===
Насколько это безопасно делать с помощью конструкторов? Спасибо.