Это 17-й день моего участия в ноябрьском испытании обновлений.Подробности о событии:Вызов последнего обновления 2021 г.
🤞 Персональная домашняя страница:@青城Sequencer Stone
🤞 Преимущества вентилятора:Добавить фан-базуОтвечайте на вопросы один на один, получайте бесплатные богатые шаблоны резюме, улучшайте учебные материалы и т. д. и станьте королем новой эры!
Lombok позволяет нам предоставить мощный инструмент для повышения производительности за счет упрощения кода, устранения избыточного кода и повышения эффективности разработки с помощью простых аннотаций. Одна из аннотаций, которые мне нравится использовать, — это @Builder. Эта аннотация позволяет мне легко использовать шаблон конструктора. В этой статье описано, как использовать @Builder в подклассах, чтобы избежать распространенных ошибок.
1. Проблемы
Для следующих двух классов один родительский класс и один дочерний класс. Оба класса хотят использовать аннотацию @Builder, которая используется для создания объекта с использованием шаблона конструктора.
@Getter
@ToString
public class Parent {
private long id;
private String name;
@Builder
@Getter
@ToString
static class Child extends Parent{
private String value;
}
}
Когда мы попытаемся скомпилировать приведенный выше код, будет сообщено об ошибке, и содержание ошибки будет следующим.
无法将类 <包路径>.Parent中的构造器 Parent应用到给定类型;
Причина в том, что это связано сLombok
Поля родительского класса не учитываются, учитываются только поля текущего подкласса.
2. Решения
Решений много, самое простое заключается в том, что мы включаем поля родительского класса в конструктор подкласса, и используем конструктор для@Builder
аннотации.
@Getter
@AllArgsConstructor
@ToString
public class Parent {
private long id;
private String name;
@Getter
@ToString
static class Child extends Parent{
private String value;
@Builder
public Child(long id,String name,String value){
super(id,name);
this.value = value;
}
}
}
Таким образом можно решить указанную выше проблему, но если мы хотим использовать родительский класс@Builder
аннотацию, как показано в коде ниже.
@Getter
@AllArgsConstructor
@ToString
@Builder
public class Parent {
...
}
При компиляции сообщается об очередной ошибке.
<包路径>.Child()无法覆盖<包路径>.Parent中的builder()
Причина этого в том, что подкласс пытается объявить построитель с тем же именем, что и у родительского класса, который должен совпадать с именем построителя. Мы можем решить эту проблему, заменив имя конструктора для подкласса, как показано в следующем коде, чтобы настроить имя для Builder подкласса.
@Builder(builderMethodName = "childBuilder")
public Child(long id,String name,String value){
super(id,name);
this.value = value;
}
Эта проблема решаема, а остроумные одноклассники переспросят, то если я унаследую более глубокий уровень, например, есть и другие классы для наследованияChild
класс, а также хочу использовать шаблон Builder, что мне делать? Самый простой способ, который я могу придумать, - это переписать конструктор унаследованного класса, как указано выше, для поддержки всех полей родительского класса.
Кроме этого метода, какой еще простой и быстрый способ? Ответ заключается в том, что сам Ломбок предлагает проверенное решение.
3. Лучшие решения
Lombok1.18
версия введена@SuperBuilder
Аннотация, использование этой аннотации для одновременного аннотирования как родительского класса, так и подкласса, может решить проблемы, с которыми мы столкнулись выше.
@Getter
@AllArgsConstructor
@ToString
@SuperBuilder
public class Parent {
private long id;
private String name;
@Getter
@ToString
@SuperBuilder
static class Child extends Parent{
private String value;
}
@Getter
@ToString
@SuperBuilder
static class ChildSChild extends Child{
private String personality;
}
}
Два момента, на которые следует обратить внимание:
-
@SuperBuilder
и@Builder
Нельзя смешивать родительский класс и дочерний класс -
@SuperBuilder
Он должен использоваться во всех родительских классах и подклассах, и один из них обязателен.
4. Резюме
использоватьLombok
Целью является повышение эффективности нашей работы.При использовании этих удобных инструментов рекомендуется внимательно разбираться в официальных пояснениях.На самом деле многие навыки использования и руководства по избеганию ям написаны в официальных документах.
Мальчик, ты не можешь видеть достаточно? нажмите на каменьПодробное описание, Просто нажмите и посмотрите, может быть, будут сюрпризы? Добро пожаловать в поддержкуНравится/подписывайтесь/комментируйте, ваша поддержка — моя самая большая мотивация для Gengwen, спасибо!