我有一个从xml文件中加载一些参数的应用程序:
JAXBContext jc = JAXBContext.newInstance(MyParams.class);
Unmarshaller u = jc.createUnmarshaller();
MyParams obj = (MyParams) u.unmarshal(inputStream);
我想制作MyParams Singleton,有可能吗?怎么样?
答案 0 :(得分:1)
好吧,您可能会以某种方式覆盖JAXB的实例化机制,以重用现有实例(您的单例)而不是创建新实例。
另一方面,我认为这应该与ObjectFactory
一起使用但不适合我:
但从我的观点来看,这不是最好的设计。在这种情况下,MyParams
的任何解组都将进入同一个实例。
我的建议是首先解组成一个独特的实例,然后将这些未编组的参数合并到你的单例中。单身人士本身往往是一种反模式,但与JAXB解组结合会使潜在的“反”更进一步。
<强>更新强>
似乎您可以使用@XmlType
和factoryClass
factoryMethod
注释来指定应如何创建MyParams
的实例。
所以可能是这样的:
@XmlType(factoryClass=MyParamsFactory.class, factoryMethod="createMyParams")
public class MyParams {
...
public static MyParams getInstance() { ... }
}
public class MyParamsFactory {
public MyParams createMyParams() { return MyParams.getInstance(); }
}
应该有用。
但是,正如我所说,我认为解组单身并不是一个好主意。这是一个明确的警告。
答案 1 :(得分:1)
以上关于将@XmlType与工厂类和方法一起使用的答案是正确的。这种情况很少见,但有些情况下单例在XML中是有意义的。
我有一个案例,我想要编组/取消编组值,例如日期,字符串,整数等。其中一个值类型为null。在我的层次结构中,Java null引用意味着未指定,因此我希望显式Null类表示指定为null的值。
当然,没有理由不止一次出现Null,所以它是一个单身人士。我将工厂类放在Null中,如下所示:
@XmlRootElement(name = "null")
@XmlType(factoryClass = Null.Factory.class, factoryMethod = "nullInstance")
public final class Null extends Value {
public static class Factory {
public static Null nullInstance(
) {
return INSTANCE;
}
}
public static final Null INSTANCE = new Null();
// Construct
/**
* Construct
*/
private Null(
) {
if (INSTANCE != null) {
throw new RuntimeException("Null is a singleton class");
}
}
// Object
@Override
public String toString(
) {
return getClass().getSimpleName();
}
// Value
@Override
public boolean isCompound(
) {
return false;
}
@Override
public boolean isScalar(
) {
return true;
}
}