@Build@SuperBuilder 都是 Java 注解,通常与 Lombok 库一起使用,目的是简化对象的构建过程。它们分别属于不同的 Lombok 特性,并且适用于不同的场景。我们来深入探讨这两个注解的区别。

1. @Builder 注解

@Builder 是 Lombok 提供的一个注解,它自动生成一个 建造者模式(Builder Pattern) 的实现。通过使用 @Builder,可以生成一个流式 API,让我们能够以更简洁的方式创建对象,而无需显式地编写构造器或者使用传统的构建者类。

示例:

import lombok.Builder;

public class Person {
    private String name;
    private int age;
    private String address;

    @Builder
    public Person(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // getters and toString methods
}

使用:

Person person = Person.builder()
    .name("John")
    .age(30)
    .address("123 Main St")
    .build();

特点:

  • @Builder 注解通过生成一个 PersonBuilder 类,使得我们能够使用链式调用的方式来设置对象的属性。
  • 适用于类没有继承关系,或者不需要处理继承时的复杂情况。

2. @SuperBuilder 注解

@SuperBuilder 是 Lombok 中 @Builder 的增强版,特别适用于 继承层次结构中的 Builder 模式。当你的类需要继承其他类,并且你希望在构建子类对象时,能够同时设置父类和子类的字段时,@SuperBuilder 就显得尤为重要。

使用 @SuperBuilder 时,Lombok 会自动为父类和子类生成建造者,支持父类和子类属性的构建,并且继承关系中的字段也能通过建造者模式来传递。

示例:

import lombok.experimental.SuperBuilder;

public class Person {
    private String name;
    private int age;

    @SuperBuilder
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // getters and toString methods
}

public class Employee extends Person {
    private String department;

    @SuperBuilder
    public Employee(String name, int age, String department) {
        super(name, age);
        this.department = department;
    }

    // getters and toString methods
}

使用:

Employee employee = Employee.builder()
    .name("John")
    .age(30)
    .department("HR")
    .build();

特点:

  • @SuperBuilder 支持 继承,它会生成一个 PersonBuilder 和一个 EmployeeBuilder,允许我们在构建 Employee 对象时同时设置 PersonEmployee 中的字段。
  • 支持 链式调用,即先构建父类字段,再构建子类字段。
  • @SuperBuilder 会为每个类生成一个独立的建造者,使得父类和子类的字段都能通过建造者进行设置。

3. 区别总结

特性

@Builder

@SuperBuilder

适用场景

用于普通类,适用于没有继承的情况

用于继承层次结构中的类,支持父类和子类共同构建

生成的 Builder 类

为每个类生成一个建造者类

为每个类生成一个独立的建造者类,同时支持父类和子类字段的构建

继承支持

不支持继承层次结构的 Builder

支持继承层次结构,可以同时构建父类和子类字段

功能扩展

适用于简单的建造者模式

扩展了 @Builder,支持复杂的继承关系

构建方式

使用 builder() 方法进行构建

使用 builder() 方法进行构建,且支持父类字段的传递

4. 使用场景举例

4.1 使用 @Builder 构建普通类

如果你有一个简单的类,没有继承其他类,使用 @Builder 就足够了:

@Builder
public class Book {
    private String title;
    private String author;
    private double price;
}

4.2 使用 @SuperBuilder 构建继承类

如果你有一个父类和子类,并且需要通过建造者模式构建子类对象,使用 @SuperBuilder

@SuperBuilder
public class Animal {
    private String name;
    private int age;
}

@SuperBuilder
public class Dog extends Animal {
    private String breed;
}
Dog dog = Dog.builder()
    .name("Rex")
    .age(5)
    .breed("Labrador")
    .build();

在这种情况下,@SuperBuilder 自动为 Dog 类生成建造者,并且支持父类 Animal 的字段 nameage 通过 Dog.builder() 方法来设置。

5. 总结

  • @Builder:适用于普通的类,简单且直接的构建者模式。
  • @SuperBuilder:适用于有继承关系的类,能够在构建子类时,同时考虑父类的字段。是对 @Builder 的增强,支持继承层次结构中的字段构建。

选择使用 @Builder@SuperBuilder,取决于你的类是否涉及继承关系。如果有继承,使用 @SuperBuilder 可以避免手动编写复杂的建造者代码。