当前位置: 首页 > article >正文

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

结果如下:
在这里插入图片描述


http://www.kler.cn/a/108466.html

相关文章:

  • js中typeOf无法区分数组对象
  • flinkOnYarn并配置prometheus+grafana监控告警
  • 驱动开发系列13 - Linux tasklet用法介绍
  • React 中如何解析字符串中的 html 结构
  • 一文窥见神经网络
  • Git在版本控制中的应用
  • 【教3妹学编程-java实战4】Map遍历删除元素的几种方法
  • etcd的mvcc源码剖析
  • 最新发布!阿里云卓越架构框架重磅升级
  • 漏洞复现--企望制造ERP系统 RCE
  • Webpack 基础以及常用插件使用方法
  • 新增选股结果树形列表,快速加载大牛股来分析——股票量化分析工具QTYX-V2.7.2...
  • mysql 增删改查基础命令
  • SpringMVC Day02 : 请求方式
  • 数组与链表算法-数组与多项式
  • 速卖通商品详情API接口获取aliexpress速卖通商品详情信息、销量、价格、商品规格信息参数调用示例说明
  • vue2 quill 视频上传 ,基于ruoyi vue,oss
  • 『阿里云盘 AList Kodi』家庭影院搭建指南
  • 本机spark 通idea连接Oracle的坑
  • Redis原理-IO模型和持久化
  • LeetCode 2656. K 个元素的最大和【数学】简单
  • 基于springboot实现休闲娱乐代理售票平台系统项目【项目源码+论文说明】
  • 数据库MySQL(五):多表查询
  • 【转信创】银河麒麟:系统安全机制
  • 【LeetCode每日一题合集】2023.10.23-2023.10.29(简单的一周)
  • SparkSQL综合案例-省份维度的销售情况统计分析