Jaxb unmarshal作为单身人士?

时间:2014-11-07 16:47:12

标签: java jaxb

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

JAXBContext jc = JAXBContext.newInstance(MyParams.class);
Unmarshaller u = jc.createUnmarshaller();
MyParams obj = (MyParams) u.unmarshal(inputStream);

我想制作MyParams Singleton,有可能吗?怎么样?

2 个答案:

答案 0 :(得分:1)

好吧,您可能会以某种方式覆盖JAXB的实例化机制,以重用现有实例(您的单例)而不是创建新实例。

另一方面,我认为这应该与ObjectFactory一起使用但不适合我:

  

Why is the ObjectFactory not used during unmarshalling?

但从我的观点来看,这不是最好的设计。在这种情况下,MyParams的任何解组都将进入同一个实例。

我的建议是首先解组成一个独特的实例,然后将这些未编组的参数合并到你的单例中。单身人士本身往往是一种反模式,但与JAXB解组结合会使潜在的“反”更进一步。

<强>更新

似乎您可以使用@XmlTypefactoryClass 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;
  }
}