繁体   English   中英

为什么 JAXB 中的 XmlAdapter 是抽象的 class?

[英]Why XmlAdapter in JAXB is abstract class?

当子类之间没有共同的实现时,我总是使用接口。 但是XmlAdapter中内置的XmlAdapter是一个抽象的class,而且里面的所有方法都是抽象的,为什么不做成接口而不是抽象的class呢? 应该是有原因的。

XmlAdapter定义了两个抽象方法,以及一个默认的无参数保护构造函数。

UnmarshallerMarshaller使用默认构造函数创建XmlAdapter的实例(除非实例与setAdapter一起提供)。

我最初的想法是,原因是确保MarshallerUnmarshaller总是有一个默认的无参数构造函数,但正如你所说,如果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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM