![](/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.