Как @ Builder / @ AllArgsConstructor Lombok может вызывать пользовательский конструктор? - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть собственный конструктор без аргументов, и я бы хотел, чтобы Builder, сгенерированный Lombok, вызывал его.Я думаю, что это эквивалентно иметь конструктор со всеми аргументами, вызывающий такой собственный конструктор без аргументов, как первое.

Я объясню на примере

@Builder
@Data
public class BuilderExample extends Foo{

  private String name;
  private int age;

  public BuilderExample(){
    super.setSome(thing);
  }

}

Экземпляр, созданныйBuilderExample.build() должен установить super.setSome(thing);

Единственный способ, который я смог найти до сих пор, это написать конструктор all-args и заставить его вызывать no-args-one.Я думаю, что это опровергает всю идею использования конструкторов и конструкторов Lombok, как будто число полей больше, чем одно или два, конструктор all-args становится утомительным для написания и поддержки.

Есть ли другой способдостичь этого?

1 Ответ

0 голосов
/ 27 сентября 2018

Вы можете определить почти пустое вложенное

class BuilderExampleBuilder {
    public BuilderExample build() {
        BuilderExample result = new ...all the stuff Lombok does
        result.setSome(thing);
        return result;
    }
}

, но у этого есть некоторые проблемы:

  • Конструктор all-args является многословным и склонен забывать новое поле.
  • Вызов result.setSome(thing) не может использовать ключевое слово super.Это можно решить, предоставив метод, подобный

    private superSetSome (Thing thing) {super.setSome (thing);}

Вы также можете использовать нестатический блок инициализатора, такой как

{
   super.setSome(thing);
}

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

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