![](/img/trans.png)
[英]JAXB XMLAdapter: Is there a way to convert this method into JAXB XmlAdapter
[英]Why XmlAdapter in JAXB is abstract class?
当子类之间没有共同的实现时,我总是使用接口。 但是XmlAdapter
中内置的XmlAdapter是一个抽象的class,而且里面的所有方法都是抽象的,为什么不做成接口而不是抽象的class呢? 应该是有原因的。
XmlAdapter
定义了两个抽象方法,以及一个默认的无参数保护构造函数。
Unmarshaller
和Marshaller
使用默认构造函数创建XmlAdapter
的实例(除非实例与setAdapter
一起提供)。
我最初的想法是,原因是确保Marshaller
和Unmarshaller
总是有一个默认的无参数构造函数,但正如你所说,如果XmlAdapter
的子类声明了一个非无参数构造函数,那将使XmlAdapter
的默认构造函数不可见的。 事实上,一个XmlAdapter
实现添加了一个带 args 的构造函数,并且没有提供无参数的构造函数,这将导致 Marshall/Unmarshall 操作失败,除非实例提供了setAdapter
方法。
因此,没有实际理由使用和抽象 class 而不是与当前实现的接口。
我的猜测是这是一个设计决策,因为从进化的角度来看,使用和抽象 class 最适合。 例如,如果在构造函数中需要某种常见的初始化,它可以在现在为空的构造函数上实现。 或者,如果XmlAdapter
中需要一个方法来编组对象列表,则可以使用如下方式实现:
public List<ValueType> marshalList(List<BoundType> list) throws Exception {
List<ValueType> result = new ArrayList<>();
for (BoundType b: list) {
result.add(marshal(b));
}
return result;
}
JAXB 内部类可以使用这种方法,而无需修改任何适配器实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.