Создание XML в конструкторах - PullRequest
0 голосов
/ 09 мая 2018

, поэтому я работаю над существующим проектом и пытаюсь его реорганизовать. Он использует 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 для этого потока, но я попробую. Отправляя это, просто чтобы посмотреть, действительно ли это даже допустимо, или я делаю какие-то хакерские вещи, которые действительно не следует делать, и именно поэтому программа в некоторых случаях ведет себя странно.

=== РЕДАКТИРОВАТЬ ===

Насколько это безопасно делать с помощью конструкторов? Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...