2012-03-11 61 views
3

我有类'设置',它将应用程序的设置存储在静态变量中(从应用程序中的任何位置“可见”),我希望具有保存/加载它的功能。JAXB有没有解组静态变量的方法?

简化设置类:

@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的所有静态变量设置为与“自然”新创建的对象相匹配,但似乎没有。
有什么办法在保留静态变量的同时实现这种行为?或者我完全错误的方法做保存/加载的应用程序设置?请帮助:)

回答

1

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

} 
0

好吧,我刚才提出的解决方法,请参见下面的代码:

设置类:

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> 

现在unmarshal测试:

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 

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

+0

玩弄后,我做了SettingsHolder.Setting例如_Public静态final_,从_static对其进行初始化{} block_从文件。如果文件不存在,它将创建新的设置实例,这是默认设置。 – Miroslav 2012-03-12 13:34:11

1

我建议制作两套变量,一套是私人的,另一套是公共静态的。

使用一种方法将private设置为静态变量。

这在我看来更容易理解,它不需要在调用该方法之外以及该类之外的代码中进行更改。

相关问题