Почему XmlAdapter в JAXB является абстрактным классом? - PullRequest
1 голос
/ 27 апреля 2020

Я всегда использую интерфейс, когда между подклассами нет общей реализации. Тем не менее, встроенный XmlAdapter в JAXB является абстрактным классом, а ALL методы там являются абстрактными, почему не сделан интерфейс вместо абстрактного класса? Должна быть причина.

1 Ответ

1 голос
/ 01 мая 2020

XmlAdapter определяет два абстрактных метода, а также конструктор по умолчанию без аргумента arg.

Unmarshaller s и Marshaller s создает экземпляры XmlAdapter с использованием конструктора по умолчанию (если только экземпляр не предоставляется с setAdapter).

Сначала я думал, что причина заключалась в том, что для Marshaller и Unmarshaller всегда существует конструктор по умолчанию без аргументов, но, как вы сказали, если бы подкласс XmlAdapter объявил конструктор без аргументов, это сделало бы конструктором по умолчанию XmlAdapter невидимый. Фактически, реализация XmlAdapter, которая добавляла конструктор с аргументами и не предоставляла конструктор без аргументов, приводила к сбою операции Marshall / Unmarshall, если только экземпляры не предоставлены с помощью методов setAdapter.

Таким образом, нет практической причины использовать и абстрагировать класс вместо интерфейса с текущей реализацией .

Полагаю, это было дизайнерское решение, поскольку использование абстрактного класса лучше всего подходит с точки зрения эволюции. Например, если в какой-то момент какая-то общая инициализация требуется в конструкторе, она может быть реализована в пустом конструкторе. Или если метод, который требуется в 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 могут использовать этот метод без необходимости изменять какие-либо реализации адаптера.

...