Является ли использование метода по умолчанию в интерфейсе хорошим шаблоном, чтобы избежать дублирования кода? - PullRequest
0 голосов
/ 29 мая 2018

У нас много дублирования кода в классах держателей данных, которые можно сериализовать в строку XML:

public String toXml() throws JAXBException {
    final JAXBContext context = JAXBContext.newInstance(this.getClass());
    final Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
    final StringWriter stringWriter = new StringWriter();
    marshaller.marshal(this, stringWriter);
    return stringWriter.toString();
}

Почему бы не переместить этот код в один интерфейс с реализацией по умолчанию?Так что простого implements ToXmlUtf8 было бы достаточно, чтобы поделиться реализацией по умолчанию и избежать дублирования кода:

public interface ToXml {
    default String toXml() throws JAXBException {
        final JAXBContext context = JAXBContext.newInstance(this.getClass());
        final Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
        final StringWriter stringWriter = new StringWriter();
        marshaller.marshal(this, stringWriter);
        return stringWriter.toString();
    }
}

Кто-нибудь делал это раньше успешно?

Другие решения?

Я мог бы также представить использование аннотации для генерации этого кода.

Есть ли какие-либо готовые решения, доступные?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

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

Хотя предполагаемый вариант использования методов по умолчанию - это добавление новых функциональных возможностей к существующим интерфейсам без разрушения старого кода, методы по умолчанию также имеют другие применения.Методы по умолчанию также используются в интерфейсах, которые были добавлены в Java 8, например, в java.util.Predicate, поэтому даже дизайнеры Java признали, что добавление новых функций в существующие интерфейсы - не единственное допустимое использование методов по умолчанию.

Недостатком может быть то, что реализованные интерфейсы являются частью публичного контракта класса, но в вашем случае это не кажется проблемой.

0 голосов
/ 29 мая 2018

Если вы используете точно такой же метод, то интерфейс не поможет, вам нужно сделать статический метод и поместить его в util класс

...