Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB是否有某种方法来解组静态变量?_Java_Xml_Variables_Static_Jaxb - Fatal编程技术网

Java JAXB是否有某种方法来解组静态变量?

Java JAXB是否有某种方法来解组静态变量?,java,xml,variables,static,jaxb,Java,Xml,Variables,Static,Jaxb,我有一个“设置”类,它将我的应用程序的设置存储在静态变量中(在应用程序的任何位置都“可见”),我想拥有保存/加载它的功能 简化设置类: @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) public class Settings { @XmlElement private static int option = 0; private Settings() { } public static int

我有一个“设置”类,它将我的应用程序的设置存储在静态变量中(在应用程序的任何位置都“可见”),我想拥有保存/加载它的功能

简化设置类:

@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>
我只是希望在解组后,它实际上会将设置的所有静态变量设置为“自然地”与新创建的对象匹配,但似乎不是这样。

有没有办法在保持静态变量的同时实现这种行为?还是我完全错误的保存/加载应用程序设置的方法?请,帮助:)

好的,我刚做了一个解决方案,请参阅下面的代码:

设置类:

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>

不过,有没有更好的保存/加载应用程序设置的解决方案?那么解组静态变量呢?我的解决方案就是不使用它们。

我建议设置两组变量,一组为私有变量,另一组为公共静态变量

使用方法将私有变量设置为静态变量


在我看来,这更容易理解,并且不需要在调用该方法和类本身之外对代码进行任何更改。

User3862024为我指明了正确的方向

毕竟,解决方案非常简单:

@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! :-)
    }

}

玩过之后,我将SettingsHolder.settinginstancepublicstatic设置为final,从文件中的static{}块初始化它。如果文件不存在,它将创建默认设置的新实例。
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
@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! :-)
    }

}