Автоматическое создание конструктора в Lombok: @SuperBuilder
Быстрый ответ
Для вызова суперконструктора с использованием аннотации @SuperBuilder в подклассе применяется метод superBuilder()
. Отметим, что аннотация @SuperBuilder
окажется полезной, если её применить к обеим классам – родительскому и дочернему. Пример применения:
// Родительский класс, который включает аннотацию @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
происходит следующим образом:
Child child = new Child("ParentName", "ChildName"); // Создаем экземпляр класса Child
Соблюдение этого подхода гарантирует правильную инициализацию полей в каждом классе в иерархии.
Продвинутые стратегии создания объектов с Lombok
После того как мы рассмотрели основы, давайте подойдём к разбору более сложных случаев использования Lombok.
Порядок вызова конструкторов
В сложных иерархиях наследования порядок вызова конструкторов может играть решающую роль:
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
вобще в под- и суперклассах повышает безопасность и надёжность кода:
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 нацелено на улучшение процесса создания сущностей:
@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
, позволяя сосредоточиться на более важных аспектах кода.
Визуализация
Суперкласс может быть представлен как фундамент всей иерархии, закладываемой в наследовании:
🏗️ Основание Суперкласса: `[███████]`
А теперь давайте добавим новый уровень с использованием Lombok:
@RequiredArgsConstructor
class ChildClass extends Superclass {
private final String extraFeature;
// Экстра-функциональность добавленного уровня
}
В Lombok новые уровни (конструкторы суперкласса) добавляются автоматически:
Основание + Первый Этаж: `[███████] + [🏠]`
Так, с помощью немногих аннотаций, Lombok призван упрощать разработку в иерархии наследования.
Раскрываем продвинутые возможности Lombok
Давайте погрузимся глубже и разберем более тонкие аспекты использования Lombok в контексте наследования.
Использование внутренних классов
С помощью внутренних классов можно осуществить эффективную инкапсуляцию, что улучшит структуру вашего кода:
public class A {
@SuperBuilder
public static class AInner {
// Инкапсулированный внутренний класс
}
}
public class B extends A.AInner {
@SuperBuilder
public static class BInner {
// Внутренний класс подкласса, продолжение инкапсуляции
}
}
Применение @Delegate
Аннотация @Delegate
прекрасно подходит для демонстрации отношений композиции:
public class Base {
public void baseMethod() { /* Реализация */ }
}
public class Child {
@Delegate
private Base base;
}
Последовательное применение аннотаций в супер- и подклассах
Использование @SuperBuilder
и @Data
позволит ускорить и облегчить процесс объявления классов:
@SuperBuilder
@Data
public class ConsistentParent { /* Поля и методы */ }
@SuperBuilder
@Data
public class ConsistentChild extends ConsistentParent { /* Дополнительные поля и методы */ }
Такой подход позволит сократить код, используя возможности Lombok для автоматической генерации методов equals
, hashCode
и toString
.
Полезные материалы
- @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor – Обширное руководство по конструкторам Lombok.
- Builder должен поддерживать поля из родительских классов · Проблема №853 · projectlombok/lombok – Обсуждение вопросов, связанных с @Builder и суперклассами на GitHub.
- Stable – Официальный список стабильных функций Lombok.
- История изменений – Последние обновления и изменения в проекте Lombok.
- – YouTube – Видеоматериал о возможностях Lombok на практике.