JAXB Есть ли способ демаршировать статические переменные? - PullRequest
3 голосов
/ 12 марта 2012

У меня есть класс «Настройки», в котором настройки моего приложения хранятся в статических переменных (чтобы они были «видны» из любой точки приложения), и я хотел бы иметь возможность сохранять / загружать его.

упрощенный класс «Настройки»:

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Settings {
    @XmlElement
    private static int option = 0;

    private Settings() {
    }

    public static int getOption() {
        return option;
    }
    public static void setOption(int option) {
        Settings.option = option;
    }
}

Код, используемый для маршала:

public static void main(String[] args) throws JAXBException {
    JAXBContext context = JAXBContext.newInstance(Settings.class);
    Marshaller m = context.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    m.marshal(new Settings(), new File("c:\\test\\test.xml"));
}

И вывод xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<settings>
    <option>**0**</option>
</settings>

Теперь проблема: при изменениизначение статическая опция int путем вызова Settings.setOption (5);как показано ниже, и отмените маршалирование ранее выбранной опции (которая была равна 0), результирующий объект настроек имеет значение для Settings.option, такое же, как текущий параметр Settings.option , который равен 5.

Settings.setOption(5);
JAXBContext context = JAXBContext.newInstance(Settings.class);
Settings s2 = (Settings)context.createUnmarshaller().unmarshal(new File("c:\\test\\test.xml"));
// Settings.option is 5, but should be 0!

Я просто надеялся, что после демаршаллинга он фактически установит все статические переменные Setting для соответствия новому созданному объекту "по природе", но, похоже, нет.Есть ли способ добиться такого поведения при сохранении статических переменных?Или я совершенно не прав насчет способа сохранения / загрузки настроек приложения?Пожалуйста, помогите:)

Ответы [ 3 ]

1 голос
/ 21 июля 2014

Я предлагаю сделать два набора переменных, один закрытый, другой открытый статический.

Используйте метод для установки частного в статические переменные.

На мой взгляд, это проще понятьи это не требует никаких изменений в коде, которые должны быть сделаны вне вызова этого метода и вне самого этого класса.

1 голос
/ 07 сентября 2014

Пользователь 3862024 указал мне правильное направление.

В конце концов, решение довольно простое:

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Settings
{

    public static int option = 0;

    private int getOption()
    {
        return option;
    }

    @XmlElement(name = "option")
    private void setOption(int option)
    {
        Settings.option = option;
    }

    public static void main(String[] args) throws JAXBException
    {
        JAXBContext context = JAXBContext.newInstance(Settings.class);
        Marshaller m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        m.marshal(new Settings(), new File("c:\\test\\test.xml"));

        Settings.option = 5;
        System.out.println(Settings.option); // prints 5
        context.createUnmarshaller().unmarshal(new File("c:\\test\\test.xml"));
        System.out.println(Settings.option); // prints 0! :-)
    }

}
0 голосов
/ 12 марта 2012

Хорошо, я только что сделал обходной путь, см. Код ниже:Класс настроек:

public final class SettingsHolder
{

    private SettingsHolder() {
        throw new AssertionError();
    }

    public static Settings settings = new Settings();

    @XmlRootElement
    @XmlAccessorType(XmlAccessType.NONE)
    public final static class Settings
    {

        @XmlElement
        private int option = 0;

        public int getOption() {
            return option;
        }

        public void setOption(int option) {
            this.option = option;
        }

    }

}

Код маршала:

JAXBContext context = JAXBContext.newInstance(SettingsHolder.Settings.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(SettingsHolder.settings, new File("c:\\test\\test.xml"));

test.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<settings>
    <option>0</option>
</settings>

Теперь несобственный тест:

SettingsHolder.settings.setOption(5);
JAXBContext context = JAXBContext.newInstance(SettingsHolder.Settings.class);

System.out.println("Old Settings: " + SettingsHolder.settings.getOption());
// prints Old Settings: 5

SettingsHolder.settings = (SettingsHolder.Settings)context.createUnmarshaller().unmarshal(new File("c:\\test\\test.xml"));

System.out.println("New Settings: " + SettingsHolder.settings.getOption());
// prints New Settings: 0

Тем не менее, есть ли кто-нибудь лучшее решение для сохранения / загрузки настроек приложения?А как насчет демонтажа статических переменных?Мое решение просто не использовать их.

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