Java Jaxb解组作为单例?
我有一个从xml文件加载一些参数的应用程序:Java Jaxb解组作为单例?,java,jaxb,Java,Jaxb,我有一个从xml文件加载一些参数的应用程序: JAXBContext jc = JAXBContext.newInstance(MyParams.class); Unmarshaller u = jc.createUnmarshaller(); MyParams obj = (MyParams) u.unmarshal(inputStream); 我想让MyParams单身,可以吗?如何?好吧,您可能可以以某种方式覆盖JAXB的实例化机制,以重用现有实例(您的单例),而不是创建新实例 另一方面
JAXBContext jc = JAXBContext.newInstance(MyParams.class);
Unmarshaller u = jc.createUnmarshaller();
MyParams obj = (MyParams) u.unmarshal(inputStream);
我想让MyParams单身,可以吗?如何?好吧,您可能可以以某种方式覆盖JAXB的实例化机制,以重用现有实例(您的单例),而不是创建新实例 另一方面,我认为这应该适用于
ObjectFactory
,但对我来说不是:
但在我看来,这不是最好的设计。在这种情况下,MyParams
的任何解组都将进入同一实例
我的建议是首先将解组化为一个不同的实例,然后将这些解组化的参数合并到您的单例中。单例本身通常是一种反模式,但将其与JAXB解组相结合将使潜在的“反”更进一步
更新
似乎您可以使用注释和来指定如何创建MyParams
的实例
所以可能是这样的:
@XmlType(factoryClass=MyParamsFactory.class, factoryMethod="createMyParams")
public class MyParams {
...
public static MyParams getInstance() { ... }
}
public class MyParamsFactory {
public MyParams createMyParams() { return MyParams.getInstance(); }
}
应该有用
但是,正如我所说的,我认为取消对singleton的注册不是一个好主意。这是一个明确的警告。上面关于将@XmlType与工厂类和方法一起使用的回答是正确的。这种情况很少见,但在某些情况下,单例在XML中是有意义的 我有一种情况,我想对值进行marshall/unmarshall处理,比如日期、字符串、整数等。其中一种值类型为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;
}
}
createMyParams
应为静态,如中为factoryClass指定的那样