Как гарантировать, что дочерний класс будет вызывать правильный супер-конструктор в ломбок? - PullRequest
2 голосов
/ 09 марта 2020

Скажите, что у меня есть следующие классы

@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class A {

    private String item1;
    private String item2;
    private String item3;
}

и

@Data
public class B extends A {

    private String item4;

    @Builder(builderMethodName = "bBuilder")
    public B(String item1, String item2, String item3, String item4) {
        super(item1, item2, item3);
        this.item4 = item4;
    }
}

как я могу (или есть ли способ) гарантировать, что дочерний конструктор вызовет " правильно "конструктор, когда я вызываю супер конструктор? Точнее говоря, я хочу на 100% убедиться, что три передаваемых мной строковых значения действительно установлены на правильные поля в родительском элементе, а не что-то, где, скажем, item1 in установлен на item2.

Я знаю что я мог, например, либо:

  • явно создать свой собственный конструктор all args
  • в дочернем конструкторе, вызвать все сеттеры родительского

но мне просто любопытно, насколько Ломбок достаточно умен, чтобы установить поля в дочернем классе на правильные поля в родительском классе?

Редактировать :

Я знаю, что порядок полей определяет порядок полей конструктора, но это для меня недостаточно безопасно, так как, если кто-то вставит новое поле, скажем, посередине, то оно скинет все .

Однако, возможно, @SuperBuilder мог бы быть чем-то, что я мог бы использовать, как некоторые предлагали, если нет, тогда я просто явно создам свой собственный конструктор, чтобы гарантировать порядок полей.

1 Ответ

2 голосов
/ 09 марта 2020

Порядок параметров @AllArgsConstructor соответствует порядку полей в исходном коде. Так что сейчас вы в безопасности.

Однако, если позже вы измените порядок полей в A (или переименуете их), вы получите неправильные назначения (или неправильные имена параметров в вашем компоновщике), но нет ошибки компилятора.

Но есть простой выход: используйте @SuperBuilder и удалите @Data. (Обратите внимание, что вам нужно @SuperBuilder для всех классов в вашей иерархии.) Вы не получите @AllArgsConstructor s, изменения порядка полей не имеют значения, а изменения имен немедленно отражаются в классах компоновщика.

Если это невозможно, ваш единственный выбор - поместить большой жирный предупреждающий комментарий в A, советуя более поздним кодировщикам не возиться с именами и порядком.

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