链式编程的原理是返回一个this对象,也就是返回对象本身,从而达到链式效果。这样可以减少一些代码量,是java8新增的内容。
此处主要介绍在新建对象使用链式编程更加方便的创建对象。链式编程的一些常见用法可以看这个:帖子
建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
建造者模式是设计模式的一种思想。
Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注释实现这一目的。
以下是常见的一些注解:
以及本次要使用的
以学生类为例,以下面几种方式分别实现输出一个对象。
public class Student {
private Integer id;
private String name;
private Integer age;
private boolean sex;
}
每一个单独写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);
}
运行结果如下图:
导包lombok
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.22version>
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;
}
首先是类,所有的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);
}
}
结果如下:
支持链式编程的注解为:@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);
}
}
使用@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);
}
}
结果如下: