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.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;


}

JAVA 链式编程和建造者模式的使用(lombok的使用)_第1张图片

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);
    }
}

结果如下:
JAVA 链式编程和建造者模式的使用(lombok的使用)_第2张图片

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文件,如下图,可以看到我们的注解被编译为上诉不使用注解相同的代码。
JAVA 链式编程和建造者模式的使用(lombok的使用)_第3张图片
测试结果如下,依然相同

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);
    }
}

JAVA 链式编程和建造者模式的使用(lombok的使用)_第4张图片

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);
    }
}

结果如下:
JAVA 链式编程和建造者模式的使用(lombok的使用)_第5张图片

你可能感兴趣的:(java,web开发,1024程序员节,java,建造者模式)