JAVA 链式编程和建造者模式的使用(lombok的使用)
0.说明
0.1 链式编程
链式编程的原理是返回一个this对象,也就是返回对象本身,从而达到链式效果。这样可以减少一些代码量,是java8新增的内容。
此处主要介绍在新建对象使用链式编程更加方便的创建对象。链式编程的一些常见用法可以看这个:帖子
0.2 建造者模式
建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
建造者模式是设计模式的一种思想。
0.3 Lombok 简介
Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注释实现这一目的。
以下是常见的一些注解:
- @Setter 注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。
- @Getter 使用方法同上,区别在于生成的是getter方法。
- @ToString 注解在类,添加toString方法。
- @EqualsAndHashCode 注解在类,生成hashCode和equals方法。
- @NoArgsConstructor 注解在类,生成无参的构造方法。
- @RequiredArgsConstructor 注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。
- @AllArgsConstructor 注解在类,生成包含类中所有字段的构造方法。
- @Data 注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
- @Slf4j 注解在类,生成log变量,严格意义来说是常量。private static final Logger log = LoggerFactory.getLogger(UserController.class);
以及本次要使用的
- @Accessors(chain = true) 默认chain=false,是否开启链式编程
- @Builder 使用构造模式
0.4 说明
以学生类为例,以下面几种方式分别实现输出一个对象。
public class Student {
private Integer id;
private String name;
private Integer age;
private boolean sex;
}
1. 普通模式
每一个单独写getter,setter方法,toString方法。
public class Student {
private Integer id;
private String name;
private Integer age;
private boolean sex;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
'}';
}
}
创建实例时,使用new方法来创建实例,如下
public static void main(String[] args) {
Student student = new Student();
student.setId(20231024);
student.setAge(10);
student.setName("duck");
student.setSex(false);
System.out.println(student);
}
运行结果如下图:
2.使用lombok简化
导包lombok
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
添加@Data注解,@Data注解可以帮我们生成get,set,toString方法
import lombok.Data;
@Data
public class Student {
private Integer id;
private String name;
private Integer age;
private boolean sex;
}
3.链式方法
3.1 不使用lombok
首先是类,所有的set方法均使用返回本身,返回this指针。
public class Student {
private Integer id;
private String name;
private Integer age;
private boolean sex;
public Integer getId() {
return id;
}
public Student setId(Integer id) {
this.id = id;
return this;
}
public String getName() {
return name;
}
public Student setName(String name) {
this.name = name;
return this;
}
public Integer getAge() {
return age;
}
public Student setAge(Integer age) {
this.age = age;
return this;
}
public boolean isSex() {
return sex;
}
public Student setSex(boolean sex) {
this.sex = sex;
return this;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
'}';
}
}
在此处即可使用链式方法给每一个属性赋值,更加方便。
public class main {
public static void main(String[] args) {
Student student = new Student();
// student.setId(20231024);
// student.setAge(10);
// student.setName("duck");
// student.setSex(false);
student.setId(20231024).setAge(20).setName("duck").setSex(true);
System.out.println(student);
}
}
结果如下:
3.2 使用lombok
支持链式编程的注解为:@Accessors(chain = true),默认chain=false
代码如下:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Student {
private Integer id;
private String name;
private Integer age;
private boolean sex;
}
在target文件夹里,我们可以找到生成的class文件,如下图,可以看到我们的注解被编译为上诉不使用注解相同的代码。
测试结果如下,依然相同
public class main {
public static void main(String[] args) {
Student student = new Student();
// student.setId(20231024);
// student.setAge(10);
// student.setName("duck");
// student.setSex(false);
student.setId(20231024).setAge(20).setName("duck").setSex(true);
System.out.println(student);
}
}
4.建造者模式
使用@Builder注解,@Builder注解也属于lombok
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@Builder
public class Student {
private Integer id;
private String name;
private Integer age;
private boolean sex;
}
使用的代码如下,不需要new一个对象,可以直接类.builder().属性1.属性2…属性n.build();如下所示
public class main {
public static void main(String[] args) {
// Student student = new Student();
// student.setId(20231024).setAge(20).setName("duck").setSex(true);
Student student = Student.builder().id(20231024).age(25).name("duck").sex(false).build();
System.out.println(student);
}
}
结果如下: