@NoArgsConstructor和@AllArgsConstructor,@Builder
属于lombok包的注解,所以得先导入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
简单点说:
- @NoArgsConstructor : 生成一个无参数的构造方法
- @AllArgsContructor: 会生成一个包含所有变量的构造方法,默认生成的方法是 public 的
- @Builder 使用创建者模式又叫建造者模式,可以针对传入的参数生成构造方法
先测试@NoArgsConstructor,@AllArgsContructor
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class Student {
public String name;
public int age;
}
编译后:
public class Student {
public String name;
public int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
会发现生成了,有参数与无参数的方法。
效果类似于
再讲@Builder
Builder使用创建者模式又叫建造者模式。简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程。
效果:
Student.builder()
.sno( "001" )
.sname( "admin" )
.sage( 18 )
.sphone( "110" )
.build();
那么@Builder内部帮我们做了什么?
1、创建一个名为 ThisClassBuilder 的内部静态类,并具有和实体类形同的属性(称为构建器)。
2、在构建器中:对于目标类中的所有的属性和未初始化的 final 字段,都会在构建器中创建对应属性。
3、在构建器中:创建一个无参的 default 构造函数。
4、在构建器中:对于实体类中的每个参数,都会对应创建类似于 setter 的方法,只不过方法名与该参数名相同。 并且返回值是构建器本身(便于链式调用),如上例所示。
5、在构建器中:一个 build() 方法,调用此方法,就会根据设置的值进行创建实体对象。
6、在构建器中:同时也会生成一个 toString() 方法。
7、在实体类中:会创建一个 builder() 方法,它的目的是用来创建构建器。
1. @Builder中使用 @Singular 注释集合
@Builder 也可以为集合类型的参数或字段生成一种特殊的方法。 它采用修改列表中一个元素而不是整个列表的方式,可以是增加一个元素,也可以是删除一个元素。
这样就可以轻松地将 List 字段中包含2个字符串。 但是想要这样来操作集合,你需要使用 @Singular 来注释字段或参数。
在使用 @Singular 注释注释一个集合字段(使用 @Builder 注释类), lombok 会将该构建器节点视为一个集合,并生成两个 adder 方法而不是 setter 方法。
Student.builder()
.sno( "001" )
.sname( "admin" )
.sage( 18 )
.sphone( "110" ).sphone( "112" )
.build();
@Singular
private List<String> sphone;
2. @Singular 注解配置value属性
User.builder()
.testHobbies("reading")
.testHobbies("eat")
.id(1)
.password("admin")
.username("admin")
.build();
@Singular(value = "testHobbies")
private List<String> hobbies;