JAVA 链式编程和建造者模式的使用(lombok的使用)

news2024/11/15 14:05:48

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.coloradmin.cn/o/1134053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用scapy 分析报文

比wireshark 更 happy udp 就简易的多&#xff0c;tcp 可能在设置bpf 时 多加几个条件 由于协议分析是手写的,所以可以对数据包的交互记录到excel 中再次进行分析

2024年天津中德应用技术大学专升本物流管理专业课考试大纲

天津中德应用技术大学物流管理专业&#xff08;高职升本科&#xff09;2024年专业基础考试大纲 一、试卷类型 物流管理专业升本专业课考试共1套试卷&#xff0c;总分200分&#xff0c;考试时间为2小时。内容包含仓储与配送管理40%、物流基础30%&#xff0c;运输管理30%&#…

双十一期间高预算广告增加,开发者如何精细化运营才能达到抢量增收目标?

随着双十一时间节点的临近&#xff0c;“双十一”大促也迎来了推广高峰&#xff0c;通常&#xff0c;大家总是认为推广高峰就是媒体收益高峰&#xff0c;但很多在变现的开发者都深有体会的是&#xff0c;广告主的投放高峰并不意味着收益高峰&#xff0c;很多开发者总结以往经验…

博通BCM575系列RDMA网卡驱动bnxt_re分析(一)

简介 整个BCM系列驱动分成以太网部分(bnxt_en.ko)和RDMA部分(bnxt_re.ko), 两个模块之间通过内核的auxiliary_bus进行管理.我们主要分析下bnxt_re驱动. 代码结构 这个驱动的核心是 qplib_fp.c, 这个文件主要包含了驱动的数据路径, 包括Post Send, Post Recv, Poll CQ流程的实…

项目管理-2023西电网课课后习题答案-第四章

文章目录 第四章答案1-1011-20 [✅] 第一章答案[✅] 第二章答案[✅] 第三章答案[✅] 第四章答案[✅] 第五章答案 第四章答案 1-10 11-20

在 history 模式下,为什么刷新页面会出现404?

1、原因 因为浏览器在刷新页面时&#xff0c;它会向服务器发送 GET 请求&#xff0c;但此时服务器并没有配置相应的资源来匹配这个请求&#xff0c;因此返回 404 错误。 2、解决方案 为了解决这个问题&#xff0c;我们需要在服务器端进行相关配置&#xff0c;让所有的路由都指…

质子 8.0-4 发布,支持更多 Linux 上的 Windows 游戏

导读Valve 近日发布了 Proton 8.0-4&#xff0c;这是 Steam Play 基于 Wine 和其他组件的开源兼容工具的最新版本&#xff0c;可让 Linux 用户玩 Windows 游戏。 在 Proton 8.0-3 发布两个半月后&#xff0c;Proton 8.0-4 正式支持更多 Windows 游戏在 Linux 上运行&#xff0c…

怎么禁止U盘拷贝电脑资料

怎么禁止U盘拷贝电脑资料 现如今U盘已经成为了人们日常传输文件的主要方式之一&#xff0c;U盘在给我们提供便利的同时&#xff0c;也带来了一些安全隐患&#xff0c;比如U盘可以轻松地复制电脑文件&#xff0c;这可能会导致机密信息泄露。因此&#xff0c;本文将介绍一些方法…

2023-10学习笔记

1.sql注入 不管是上一篇博客&#xff0c;通过java代码执行sql 还是我们常用的Mybatis的#{}和${} 都会提到sql注入的问题 1.1啥是sql注入 应该知道是说传入无关的参数&#xff0c;比如本来是想要一个where条件查询参数 但是你拼了一个drop 比如 原来的sql select * from…

经典卷积神经网络 - ResNet

ResNet是一种残差网络&#xff0c;咱们可以把它理解为一个子网络&#xff0c;这个子网络经过堆叠可以构成一个很深的网络。 我们一直在加深神经网络&#xff0c;但是加深不一定只会带来好处。 残差块 串联一个层改变函数类&#xff0c;我们希望能扩大函数类残差块加入快速通…

Unity的碰撞检测(三)

温馨提示&#xff1a;本文基于前一篇“Unity的碰撞检测(二)”继续探讨两个游戏对象具备刚体的碰撞检测&#xff0c;阅读本文则默认已阅读前文。 &#xff08;一&#xff09;测试说明 在基于两个游戏对象都具备碰撞器和刚体且属性一致的条件下&#xff0c;若二者刚体的BodyType…

常用数据分析可视化图表解析之【雷达图】

雷达图&#xff08;Radar Chart&#xff09; 基础介绍 雷达图是一种常用的数据可视化图表&#xff0c;通过使用多边形的边和顶点来表示多个变量或维度的数据。每个变量或维度对应于雷达图的一个轴&#xff0c;数据值则通过距离中心点的距离来表示。 雷达图可以直观地展示不同…

为何各大厂现在只招测试开发了?

近期闲着无聊晚上有空会刷下boss&#xff0c;发现现在各种互联网大厂绝大部分测试相关岗位都变成了测试开发工程师&#xff0c;这就是说就算最后是被拉去做业务测试&#xff0c;也得具备测试开发的能力了&#xff0c;这是间接把行业门槛变高了&#xff1f;&#xff1f;那不会测…

项目管理-2023西电网课课后习题答案-第五章

文章目录 第五章答案1-10 [✅] 第一章答案[✅] 第二章答案[✅] 第三章答案[✅] 第四章答案[✅] 第五章答案 第五章答案 1-10

Vue标准插槽和作用域插槽区别与用法详解

文章目录 1. 标准插槽&#xff08;Standard Slots&#xff09;2. 作用域插槽&#xff08;Scoped Slots&#xff09;3.标准插槽Vs作用域插槽4.作用域插槽高级用法1. 作用域插槽中的默认值2. 作用域插槽的多个插槽3. 作用域插槽的动态插槽名4. 作用域插槽中的函数传递 5.作用域插…

王道p149 3.编写后序遍历二叉树的非递归算法(c语言代码实现)

本题代码如下 void postorder(tree* t) {struct treenode* stack[100];//初始化结构体数组int top -1;//让栈顶指向-1treenode* p *t;while (p || top ! -1)//p不为空&#xff0c;并且栈不为空{if (p){top;//p不为空&#xff0c;将p压入栈中stack[top] p;p p->lchild;/…

thinkphp6项目使用多应用开发

使用composer安装项目&#xff0c;命令&#xff1a;composer create-project topthink/think thinkphp6使用多应用开发&#xff0c;安装多应用扩展&#xff0c;命令&#xff1a;composer require topthink/think-multi-app安装多应用扩展成功后&#xff0c;删除app/controller文…

编译报错 internal compiler error: Segmentation fault 解决方法

问题描述 最近在使用虚拟机 ubuntu 20.04 编译 musl gcc 工具链时&#xff0c;遇到一个奇怪的问题&#xff0c;编译过程中异常退出&#xff0c;清理了多次重新编译&#xff0c;发现编译报错提示的信息是 internal compiler error: Segmentation fault 由于之前是可以正常编译的…

java 接口返回乱码 接口中文返回乱码 请求接口返回\u5317\u4eac乱码 okhttp请求返回中文乱码

1. 对接第三方请求&#xff0c;返回参数中文乱码&#xff0c;如下图所示。 2. 原因&#xff1a;中文被unicode编码导致。okhttp设置返回编码格式也不生效&#xff1a; // String result new String(response.body().bytes(), "utf-8");3. 解决方案&…

JS三种常见的存储机制

1.localStorage localStorage是HTML5引入的一种持久化存储机制&#xff0c;用于在浏览器中长期保存数据。localStorage中存储的数据没有过期时间&#xff0c;除非被显式清除或代码删除。存储在localStorage中的数据对于同一个域名下的所有页面都是共享的。localStorage可以存储…