簡體   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