一.概述
@Builder注解是lombok工具类为我们提供的一个注解,加上此注解,我们就可以通过链式构造创建对象。
二、属性介绍
@Builder.Default:加在属性上,非 final 的字段可以有默认值
builderMethodName:指定创建内部静态类的方法名,默认值为 builder
buildMethodName:指定静态类中创建实体类的方法名,默认值为 build
builderClassName:指定内部静态的类名,默认创建的类名为 外部类的类名+Builder
toBuilder:设置为 true 则可以根据这个类生成静态内部类Builder对象,然后可以根据这个builder对象来修改此类。默认为 false
access:设置 builderMethodName 的访问权限修饰符,默认为 public
三.分析
我们可以随意创建一个类,加上@Builder注解,再通过查看其编译后的.class文件来看其原理。
以下是代码:
import lombok.Builder;
@Builder
public class Car {
//发动机
private String engine;
//轮胎
private String tyre;
}
.class文件
public class Car {
private String engine;
private String tyre;
Car(final String engine, final String tyre) {
this.engine = engine;
this.tyre = tyre;
}
public static Car.CarBuilder builder() {
return new Car.CarBuilder();
}
public static class CarBuilder {
private String engine;
private String tyre;
CarBuilder() {
}
public Car.CarBuilder engine(final String engine) {
this.engine = engine;
return this;
}
public Car.CarBuilder tyre(final String tyre) {
this.tyre = tyre;
return this;
}
public Car build() {
return new Car(this.engine, this.tyre);
}
public String toString() {
return "Car.CarBuilder(engine=" + this.engine + ", tyre=" + this.tyre + ")";
}
}
}
通过查看其.class文件,我们发现其为这个类添加了有参构造器,一个静态内部类和一个获取静态内部类对象的方法。
其实其使用了建造者模式。即在此类中加上了Builder静态内部类,我们可以通过Builder内部类来分步骤创建外部类的部件,最后再通过build()方法来进行组装。
关于建造者模式,可以查看这一篇文章。
但是,其没有创建无参构造,如果想要创建无参构造器,仅仅加上@NoArgsConstructor注解或者自定义无参构造器是不行的,编译时会报错,可以加上@AllArgsConstructor, @NoArgsConstructor,这两个注解来生成无参构造器。
四.使用方式
1.在类上加上@Builder注解
2.当需要创建对象时,先通过builder()方法获取其Builder内部类,再调用内部类中的各个方法进行赋值,最后调用build()方法,将刚才的值赋给外部类,从而创建所需要的对象。
也可以直接调用其构造器进行创建对象。
class MAIN{
public static void main(String[] args) {
Car car = Car.builder()
.engine("自研发动机")
.tyre("固特异")
.build();
System.out.println(car);
}
}
总结
使用此注解,可以使用链式构造来创建对象。在参数很多时可以很清楚的明白每个参数是什么意思,也使创建的过程更加清晰。