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 说明

以学生类为例,以下面几种方式分别实现输出一个对象。

java 复制代码
public class Student {
    private Integer id;
    private String name;
    private Integer age;
    private boolean sex;

}

1. 普通模式

每一个单独写getter,setter方法,toString方法。

java 复制代码
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方法来创建实例,如下

java 复制代码
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

xml 复制代码
		<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>

添加@Data注解,@Data注解可以帮我们生成get,set,toString方法

java 复制代码
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指针。

java 复制代码
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 +
                '}';
    }
}

在此处即可使用链式方法给每一个属性赋值,更加方便。

java 复制代码
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

代码如下:

java 复制代码
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 复制代码
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

java 复制代码
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();如下所示

java 复制代码
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);
    }
}

结果如下:

相关推荐
计算机学姐几秒前
基于SSM的宠物领养平台
java·vue.js·spring·maven·intellij-idea·mybatis·宠物
泰山小张只吃荷园10 分钟前
期末Python复习-输入输出
java·前端·spring boot·python·spring cloud·docker·容器
Mr_Xuhhh13 分钟前
程序地址空间
android·java·开发语言·数据库
YSRM19 分钟前
异或-java-leetcode
java·算法·leetcode
大明湖的狗凯.22 分钟前
MySQL 中的乐观锁与悲观锁
java·数据库·mysql
z2023050827 分钟前
linux之调度管理(13)- wake affine 唤醒特性
java·开发语言
AI人H哥会Java28 分钟前
【JAVA】Java高级:Java网络编程——TCP/IP与UDP协议基础
java·开发语言
robin_suli1 小时前
Java多线程八股(三)一>多线程环境使用哈希表和ArrayList
java·开发语言·多线程·哈希表
NiNg_1_2341 小时前
Java中的多线程
java·开发语言
丁总学Java1 小时前
nohup java -jar supporterSys.jar --spring.profiles.active=prod &
java·spring·jar