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