Lombok @ Wither Inheritance (супер- / подклассы) - PullRequest
1 голос
/ 25 июня 2019

Подскажите, пожалуйста, как использовать @Wither при применении наследования.

У меня есть абстрактный класс Parent и конкретный Child. Child должен быть неизменным. Помещение @Wither на оба дает мне две ошибки:

  • Конструктор Child (String) не определен
  • Тип Child должен реализовывать унаследованный абстрактный метод Parent.withA (String)
@Value
@Wither
@NonFinal
@SuperBuilder
abstract class Parent {
    String a;
}

@Value
@Wither
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
class Child extends Parent {
    String b;
}

Я был бы рад просто удалить @Wither и использовать методы компоновщика, но я реорганизую публичную библиотеку (пытаюсь оптимизировать классы модели) и не хочу, чтобы на моих клиентах возникали ошибки компиляции.

Я также обнаружил эту проблему, которая объясняет вторую ошибку. Но логика намерения не ясна https://github.com/rzwitserloot/lombok/issues/945

1 Ответ

2 голосов
/ 25 июня 2019

Lombok - процессор аннотаций. Они запускаются на каждом модуле компиляции (то есть файле Java) и не имеют доступа к информации из других модулей компиляции. Это значит, что Lombok не может ничего знать о содержимом класса Parent при обработке Child.

Таким образом, при генерации кода для Child Ломбок не знает, какие методы унаследованы от Parent. Следовательно, он не может сгенерировать реализацию для абстрактного withA() из Parent.

Вторая проблема заключается в том, что для методов, требующих засухи, необходим конструктор, в котором все поля имеют параметры, включая поля из суперкласса. Это также невозможно сгенерировать для Lombok из-за вышеупомянутого ограничения.

Короче говоря: @Wither плохо работает с наследованием. Я предлагаю поставить его только на Parent и реализовать его вручную для Child.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...