Java Jaxb解组作为单例?

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的实例化机制,以重用现有实例(您的单例),而不是创建新实例 另一方面

我有一个从xml文件加载一些参数的应用程序:

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指定的那样