首先了解@Builder
引入依赖(Maven结构)
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
创建一个类
@Builder
public class Ming {
private Integer age;
private String name;
}
这里使用@Builder
注解,就可以在创建新实例的时候这样写:
Ming mingA = Ming.builder().build();
Ming mingB = Ming.builder()
.age(11)
.build();
Ming mingD = Ming.builder()
.age(11)
.name("小明")
.build();
可以看到,我们只要写一个@Builder
注解,有如下好处:
1 一个注解代替若干参数情况下的构造函数
,缩减了构造类的代码量
2 通过Builder构造
的方式,即 .属性名(值)
这样的方式,比直接使用构造函数的方式更加具备可读性
,比频繁使用set方法
的方式更加简洁。
了解@SuperBuilder
@SuperBuilder解决了什么样的问题
将例子中的Ming这个类的成员属性放到父类当中:
public class Person {
private Integer age;
private String name;
}
@Builder
public class Ming extends Person{
}
这个时候,我们之前的调用的 .builder
都会报错,这是因为@Builder并不支持父类成员属性的构造
,@SuperBuilder注解的出现,就是用来解决这个问题
。
@SuperBuilder
public class Person {
private Integer age;
private String name;
}
@SuperBuilder
public class Ming extends Person{
}
这样子类就可以正常获取到父类的成员属性进行builder构造了。
@SuperBuilder(toBuilder = true)用法
toBuilder属性默认关闭
,如果开启,则所有的父类应该也要开启
,效果如下:
Ming mingD = Ming.builder()
.age(11)
.name("小明")
.build();
Ming mingF = mingD.toBuilder().name("猪").build();
System.err.println(mingD.toString());
System.err.println(mingF.toString());
通过设置true
,所有的类实例会拥有toBuilder方法
这是一个类似深拷贝
的一个方法,不会改变原有实例的属性
,生成一个新的实例
。在toBuilder中有赋值的属性
则会改变为赋值属性
,没有赋值的以调用的实例中的值为准
。
@SuperBuilder(buildMethodName = “execute”, builderMethodName = “helloWorld”, toBuilder = true) 用法
这个用法其实没什么意思,就是自定义方法名,不展开赘述。
注意
注意补充构造方法
使用@Builder或@SuperBuilder注解
时,不会默认创建空参构造函数
,如果你有额外使用空参构造函数或全参构造函数的需求,需要在子类和父类都加上以下注解:
@AllArgsConstructor //全参构造函数
@NoArgsConstructor //空参构造函数
@SuperBuilder(toBuilder= true) 不生效
使用A.builder().父类B属性().build()
报错,首先检查
A 类 要加@SuperBuilder(toBuilder= true)
父类B 同时也要加 @SuperBuilder(toBuilder= true)