📜  Spring Boot 中的 @builder 注释 (1)

📅  最后修改于: 2023-12-03 15:20:12.800000             🧑  作者: Mango

Spring Boot中的 @Builder注解

@Builder是一个由Lombok提供的注解,它让我们可以使用一种简洁、优雅的方式来构建复杂的对象。

为什么需要@Builder注解?

在Java中,我们通常通过构造函数或者setter方法来初始化对象的属性。例如:

Person person = new Person();
person.setName("Tom");
person.setAge(18);

如果一个对象有很多个属性需要设置,这种方式就显得比较繁琐。而且有很多重复的代码。

对于这种情况,我们通常会想到使用Builder模式。Builder模式让我们能够使用流式API来构建对象:

Person person = Person.builder()
            .name("Tom")
            .age(18)
            .build();

但是Builder模式要求我们手动编写Builder类,这增加了代码量,而且还需要花费很多时间去编写和维护Builder类。

这时候,@Builder就派上用场了。它可以帮助我们自动生成Builder类,从而减少了代码的编写量。

如何使用@Builder注解?

我们只需要在需要生成Builder类的类上添加@Builder注解即可。

import lombok.Builder;

@Builder
public class Person {
    private String name;
    private int age;
}

使用@Builder注解后,Lombok会自动生成一个内部类PersonBuilder,我们可以通过Person.builder()来使用这个Builder。

生成的PersonBuilder类具有与我们手写的Builder类一样的功能。它有一个与Person类相似的构造函数和多个方法来设置属性。最后,我们可以调用build()方法来构建Person对象。

我们可以通过以下方式来使用PersonBuilder

Person person = Person.builder()
            .name("Tom")
            .age(18)
            .build();
可以使用@Builder注解的方法

在Lombok中,除了类还有其他一些元素可以使用@Builder注解。

  1. 构造函数
@AllArgsConstructor
@Builder
public class Person {
    private String name;
    private int age;
}

使用@Builder注解后,Lombok会自动生成如下代码:

@Generated("lombok")
public static class PersonBuilder {
    private String name;
    private int age;
    PersonBuilder() {
    }
    public Person.PersonBuilder name(String name) {
        this.name = name;
        return this;
    }
    public Person.PersonBuilder age(int age) {
        this.age = age;
        return this;
    }
    public Person build() {
        return new Person(this.name, this.age);
    }
    public String toString() {
        return "Person.PersonBuilder(name=" + this.name + ", age=" + this.age + ")";
    }
}

我们可以使用@AllArgsConstructor注解在Person类上,表示使用所有参数的构造函数,在这个构造函数中为所有属性自动生成构造函数参数。

  1. 静态工厂方法
@Builder(builderClassName = "Builder")
public class Person {
    private String name;
    private int age;
    public static PersonBuilder builder() {
        return new PersonBuilder();
    }
}

使用@Builder注解后,Lombok会自动生成PersonBuilder类。我们可以通过Person.builder()来获取这个Builder。

通过指定builderClassName参数,我们可以修改Builder类的名称。

  1. 泛型
@Builder
public class Pair<T, U> {
    private T first;
    private U second;
}

如果我们需要一个带有多个类型参数的泛型类,我们可以在类上使用@Builder注解,Lombok会为我们生成一个泛型的Builder类。

总结

@Builder注解可以帮助我们通过流式API的方式构建对象,同时减少了我们手写Builder类的工作量。但是需要注意的是,注解会影响类的结构,因此需要谨慎使用。