0

我们通过 pom 扩展 JAXBEqualsStrategy:

<xjcArg>-Xequals-equalsStrategyClass=com.acme.foo.CustomEqualsStrategy</xjcArg>

CustomEqualsStrategy 扩展了 JAXBEqualsStrategy。在 Eclipse (Keplar) 中运行 MAVEN clean install generate-source 后,我们的模型类具有如下 equals 方法:

    public boolean equals(Object object) {
      final EqualsStrategy strategy = new CustomEqualsStrategy();
      return equals(null, null, object, strategy);
    }

然而,如果我们不扩展 JAXBEqualsStrategy,我们的模型类就会有这样的 equals 方法:

    public boolean equals(Object object) {
      final EqualsStrategy strategy = JAXBEqualsStrategy.INSTANCE;
      return equals(null, null, object, strategy);
}

JAXBEqualsStrategy 有

    public static EqualsStrategy INSTANCE = new JAXBEqualsStrategy();

我们期望得到

    final EqualsStrategy strategy = CustomEqualsStrategy.INSTANCE;

在生成的 equals 方法中并正在努力实现它。

4

2 回答 2

0

免责声明:插件作者在这里。

实际上,您也可以生成 .INSTANCE 或 .getInstance() 调用。请看这段代码:

https://svn.java.net/svn/jaxb2-commons~svn/basics/trunk/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/util/StrategyClassUtils.java

所以:

  • 如果运行时中的插件知道您的 equals 策略的类并且
  • 您的类具有getInstance()正确类型的公共静态方法或
  • INSTANCE您的班级有一个正确类型的公共静态字段

然后插件将使用YourStrategy.getInstance()orYourStrategy.INSTANCE代替new YourStrategy().

我猜你已经有了一个 INSTANCE 方法。请尝试将 JAR 与您的策略一起包含到 XJC 类路径中(以便插件可以在编译时解析您的策略类)。

也请随时提交问题以支持-Xequals-equalsStrategyInstanceField=com.acme.foo.CustomEqualsStrategy.INSTANCE相应的语法或 InstanceMethod。

于 2014-08-01T11:23:30.010 回答
0

不想使用CustomEqualsStrategy.INSTANCE. 使用new CustomEqualsStrategy()是正确的,应该是首选,除非你有很好的理由不这样做。

由于CustomEqualsStrategyextends JAXBEqualsStrategy,这意味着除非您INSTANCE在内部定义自己的字段,否则与CustomEqualsStrategy,CustomEqualsStrategy.INSTANCE相同JAXBEqualsStrategy.INSTANCE,这意味着您JAXBEqualsStrategy毕竟将使用 的实例。

另外,使用这样的INSTANCE字段有效地表明您的类旨在用作单例,因此必须是无状态的。大多数类都不是无状态的,即使对于无状态的类,许多这样的类也不需要以单例样式使用。

总之,真的只要坚持new CustomEqualsStrategy()。代码中的惊喜会更少,你会更开心。(另外,通过阅读 的代码JAXBEqualsStrategy,也许您应该进行扩展DefaultEqualsStrategy。)

于 2014-07-26T15:34:12.150 回答