📅  最后修改于: 2023-12-03 15:20:12.800000             🧑  作者: Mango
@Builder
是一个由Lombok提供的注解,它让我们可以使用一种简洁、优雅的方式来构建复杂的对象。
在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
注解即可。
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();
在Lombok中,除了类还有其他一些元素可以使用@Builder
注解。
@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
类上,表示使用所有参数的构造函数,在这个构造函数中为所有属性自动生成构造函数参数。
@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类的名称。
@Builder
public class Pair<T, U> {
private T first;
private U second;
}
如果我们需要一个带有多个类型参数的泛型类,我们可以在类上使用@Builder
注解,Lombok会为我们生成一个泛型的Builder类。
@Builder
注解可以帮助我们通过流式API的方式构建对象,同时减少了我们手写Builder类的工作量。但是需要注意的是,注解会影响类的结构,因此需要谨慎使用。