Ямы Lombok @Builder, о которых вы могли не знать!

Java задняя часть Project Lombok
Ямы Lombok @Builder, о которых вы могли не знать!

Это 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;
    }
}

Два момента, на которые следует обратить внимание:

  1. @SuperBuilderи@BuilderНельзя смешивать родительский класс и дочерний класс
  2. @SuperBuilderОн должен использоваться во всех родительских классах и подклассах, и один из них обязателен.

4. Резюме

использоватьLombokЦелью является повышение эффективности нашей работы.При использовании этих удобных инструментов рекомендуется внимательно разбираться в официальных пояснениях.На самом деле многие навыки использования и руководства по избеганию ям написаны в официальных документах.


Мальчик, ты не можешь видеть достаточно? нажмите на каменьПодробное описание, Просто нажмите и посмотрите, может быть, будут сюрпризы? Добро пожаловать в поддержкуНравится/подписывайтесь/комментируйте, ваша поддержка — моя самая большая мотивация для Gengwen, спасибо!