ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Автоматическое создание конструктора в Lombok: @SuperBuilder

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для вызова суперконструктора с использованием аннотации @SuperBuilder в подклассе применяется метод superBuilder(). Отметим, что аннотация @SuperBuilder окажется полезной, если её применить к обеим классам – родительскому и дочернему. Пример применения:

Java
Скопировать код
// Родительский класс, который включает аннотацию @SuperBuilder
@SuperBuilder
public class Parent {
    private String parentName;
}

// Дочерний класс расширяет родительский
@SuperBuilder
public class Child extends Parent {
    private String childName;

    public Child(String parentName, String childName) {
        super(superBuilder().parentName(parentName)); // Инициализация полей родительского класса
        this.childName = childName; // Добавлены только поля подкласса
    }
}

Создание объекта класса Child происходит следующим образом:

Java
Скопировать код
Child child = new Child("ParentName", "ChildName"); // Создаем экземпляр класса Child

Соблюдение этого подхода гарантирует правильную инициализацию полей в каждом классе в иерархии.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Продвинутые стратегии создания объектов с Lombok

После того как мы рассмотрели основы, давайте подойдём к разбору более сложных случаев использования Lombok.

Порядок вызова конструкторов

В сложных иерархиях наследования порядок вызова конструкторов может играть решающую роль:

Java
Скопировать код
public class Grandparent {
    protected final String name;
    public Grandparent(String name) { this.name = name; }
}

public class Parent extends Grandparent {
    public Parent(String name) { super(name); }
}

@NoArgsConstructor
public class Child extends Parent {
    private String childSpecificField;
}

В данном примере аннотация @NoArgsConstructor необходима для создания структурированного и понятного кода при определении конструкторов без аргументов.

Неизменяемость для обеспечения безопасности

Объявление полей как final вобще в под- и суперклассах повышает безопасность и надёжность кода:

Java
Скопировать код
public class ImmutableParent {
    private final String parentProperty;
    
    public ImmutableParent(String parentProperty) {
        this.parentProperty = parentProperty;
    }
}

@AllArgsConstructor
@SuperBuilder
public class ImmutableChild extends ImmutableParent {
    private final String childProperty;
}

Использование аннотации @AllArgsConstructor помогает эффективно инициализировать неизменяемые поля.

Совмещение использования Lombok и JPA

Использование аннотаций Lombok совместно со Spring Data JPA нацелено на улучшение процесса создания сущностей:

Java
Скопировать код
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class EntityParent {
    @Id
    private Long id;
    private String description;
}

@EqualsAndHashCode(callSuper = true)
@Entity
public class EntityChild extends EntityParent {
    private String childSpecificAttribute;
}

Аннотация @Data предоставляет функционал для создания геттеров, сеттеров и методов hashCode, позволяя сосредоточиться на более важных аспектах кода.

Визуализация

Суперкласс может быть представлен как фундамент всей иерархии, закладываемой в наследовании:

Markdown
Скопировать код
🏗️ Основание Суперкласса: `[███████]`

А теперь давайте добавим новый уровень с использованием Lombok:

Java
Скопировать код
@RequiredArgsConstructor
class ChildClass extends Superclass {
    private final String extraFeature;
    // Экстра-функциональность добавленного уровня
}

В Lombok новые уровни (конструкторы суперкласса) добавляются автоматически:

Markdown
Скопировать код
Основание + Первый Этаж: `[███████] + [🏠]`

Так, с помощью немногих аннотаций, Lombok призван упрощать разработку в иерархии наследования.

Раскрываем продвинутые возможности Lombok

Давайте погрузимся глубже и разберем более тонкие аспекты использования Lombok в контексте наследования.

Использование внутренних классов

С помощью внутренних классов можно осуществить эффективную инкапсуляцию, что улучшит структуру вашего кода:

Java
Скопировать код
public class A {
    @SuperBuilder
    public static class AInner {
        // Инкапсулированный внутренний класс
    }
}

public class B extends A.AInner {
    @SuperBuilder
    public static class BInner {
        // Внутренний класс подкласса, продолжение инкапсуляции
    }
}

Применение @Delegate

Аннотация @Delegate прекрасно подходит для демонстрации отношений композиции:

Java
Скопировать код
public class Base {
    public void baseMethod() { /* Реализация */ }
}

public class Child {
    @Delegate
    private Base base;
}

Последовательное применение аннотаций в супер- и подклассах

Использование @SuperBuilder и @Data позволит ускорить и облегчить процесс объявления классов:

Java
Скопировать код
@SuperBuilder
@Data
public class ConsistentParent { /* Поля и методы */ }

@SuperBuilder
@Data
public class ConsistentChild extends ConsistentParent { /* Дополнительные поля и методы */ }

Такой подход позволит сократить код, используя возможности Lombok для автоматической генерации методов equals, hashCode и toString.

Полезные материалы

  1. @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor – Обширное руководство по конструкторам Lombok.
  2. Builder должен поддерживать поля из родительских классов · Проблема №853 · projectlombok/lombok – Обсуждение вопросов, связанных с @Builder и суперклассами на GitHub.
  3. Stable – Официальный список стабильных функций Lombok.
  4. История изменений – Последние обновления и изменения в проекте Lombok.
  5. – YouTube – Видеоматериал о возможностях Lombok на практике.