Java类的Builder应用以及使用@Data和@Builder高效应用Builder
⭐Java Builder模式:是Java设计模式之一,它属于对象创建型模式,是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
结论一:使用lombok的@Data和@Builder注解构建Java类的Builder简洁高效,推荐实际应用。
结论二:手动编写Java类的Builder,能够全貌理解Builder模式,推荐试试。
结论三:Java类的Builder模式,最大好处就是构建对象时,可以灵活构建需要的属性。
目录
- 1.1普通Java类.
- 1.1.1普通Java对象
- 1.2普通Java类使用@Data注解
- 1.2.1普通Java类
- 1.3手动编写Java类的Builder(静态内部类)
- 1.3.1手动编写Java类的Builder
- 1.3.2代码中的getCityInfoSuccess和getCityInfoFail是对builder封装使用
- 1.4使用lombok的@Data和@Builder注解构建Java对象的Builder
- 1.4.1使用@Data和@Builder注解
- 1.4.2代码中的getCityInfoSuccess和getCityInfoFail是对builder封装使用
- 1.5普通Jave类和Builder类分开
- 1.5.1普通Java类
- 1.5.2普通Java类的Builder类
- 1.6测试
1.1普通Java类.
1.1.1普通Java对象
普通Java类,一般有属性、set、get、toString方法。
public class City01Response implements Serializable {private boolean success;private String msg;private Long cityId;private String cityName;private String cityDescribe;public City01Response() {}public boolean isSuccess() {return success;}public void setSuccess(boolean success) {this.success = success;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Long getCityId() {return cityId;}public void setCityId(Long cityId) {this.cityId = cityId;}public String getCityName() {return cityName;}public void setCityName(String cityName) {this.cityName = cityName;}public String getCityDescribe() {return cityDescribe;}public void setCityDescribe(String cityDescribe) {this.cityDescribe = cityDescribe;}@Overridepublic String toString() {return "City01Response(" + "success=" + success + ", msg=" + msg + ", cityId=" + cityId + ", cityName=" + cityName + ", cityDescribe=" + cityDescribe + ")";}
}
1.2普通Java类使用@Data注解
1.2.1普通Java类
使用@Data注解后,普通Java类,只有属性。set、get、toString方法由@Data注解接管。使用方式等价。
@Data
public class City01Response implements Serializable {private boolean success;private String msg;private Long cityId;private String cityName;private String cityDescribe;
}
1.3手动编写Java类的Builder(静态内部类)
1.3.1手动编写Java类的Builder
本例内部类使用静态类实现,build使用静态方法。
普通Java类:City02Response
(1)编写普通Java类:City02Response,一般有属性、set、get、toString方法。
(2)在普通Java类:City02Response中,编写一个内部类:City02ResponseBuilder。
(3)在普通Java类:City02Response中,实现一个builder方法,创建一个内部类City02ResponseBuilder的对象。
(4)在内部类:City02ResponseBuilder中,实现一个build方法,返回普通Java类:City02Response的对象。
(5)在内部类:City02ResponseBuilder中。为每个属性实现一个设置方法,并且返回City02ResponseBuilder对象本身,即返回this。
public class City02Response implements Serializable {private boolean success;private String msg;private Long cityId;private String cityName;private String cityDescribe;public static City02Response.City02ResponseBuilder builder() {return new City02Response.City02ResponseBuilder();}public static City02Response getCityInfoSuccess(Long cityID, String cityName, String cityDescribe) {return builder().success(true).msg("获取城市信息成功").cityId(cityID).cityName(cityName).cityDescribe(cityDescribe).build();}public static City02Response getCityInfoFail(Long cityID, String failMsg) {return builder().success(false).msg(failMsg).cityId(cityID).build();}public City02Response() {}public City02Response(boolean success, String msg, Long cityId, String cityName, String cityDescribe) {this.success = success;this.msg = msg;this.cityId = cityId;this.cityName = cityName;this.cityDescribe = cityDescribe;}@Overridepublic String toString() {return "City02Response(" + "success=" + success + ", msg=" + msg + ", cityId=" + cityId + ", cityName=" + cityName + ", cityDescribe=" + cityDescribe + ")";}public boolean isSuccess() {return success;}public void setSuccess(boolean success) {this.success = success;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Long getCityId() {return cityId;}public void setCityId(Long cityId) {this.cityId = cityId;}public String getCityName() {return cityName;}public void setCityName(String cityName) {this.cityName = cityName;}public String getCityDescribe() {return cityDescribe;}public void setCityDescribe(String cityDescribe) {this.cityDescribe = cityDescribe;}public static class City02ResponseBuilder {private boolean success;private String msg;private Long cityId;private String cityName;private String cityDescribe;City02ResponseBuilder() {}public City02Response build() {return new City02Response(success, msg, cityId, cityName, cityDescribe);}public City02Response.City02ResponseBuilder success(final boolean success) {this.success = success;return this;}public City02Response.City02ResponseBuilder msg(final String msg) {this.msg = msg;return this;}public City02Response.City02ResponseBuilder cityId(final Long cityId) {this.cityId = cityId;return this;}public City02Response.City02ResponseBuilder cityName(final String cityName) {this.cityName = cityName;return this;}public City02Response.City02ResponseBuilder cityDescribe(final String cityDescribe) {this.cityDescribe = cityDescribe;return this;}@Overridepublic String toString() {return "City02ResponseBuilder.City02Response(" + "success=" + success + ", msg=" + msg + ", cityId=" + cityId + ", cityName=" + cityName + ", cityDescribe=" + cityDescribe + ")";}}
}
1.3.2代码中的getCityInfoSuccess和getCityInfoFail是对builder封装使用
代码中的getCityInfoSuccess和getCityInfoFail是对builder封装应用。不是必须部分。
1.4使用lombok的@Data和@Builder注解构建Java对象的Builder
1.4.1使用@Data和@Builder注解
使用@Data和@Builder注解,简化代码,效果等价。需引入jar包。
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version>
</dependency>
@Data
@Builder
public class City03Response implements Serializable {private boolean success;private String msg;private Long cityId;private String cityName;private String cityDescribe;public static City03Response getCityInfoSuccess(Long cityID, String cityName, String cityDescribe) {return builder().success(true).msg("获取城市信息成功").cityId(cityID).cityName(cityName).cityDescribe(cityDescribe).build();}public static City03Response getCityInfoFail(Long cityID, String failMsg) {return builder().success(false).msg(failMsg).cityId(cityID).build();}
}
1.4.2代码中的getCityInfoSuccess和getCityInfoFail是对builder封装使用
代码中的getCityInfoSuccess和getCityInfoFail是对builder封装应用。不是必须部分。
1.5普通Jave类和Builder类分开
1.5.1普通Java类
public class City04Response {private boolean success;private String msg;private Long cityId;private String cityName;private String cityDescribe;public City04Response(boolean success, String msg, Long cityId, String cityName, String cityDescribe) {this.success = success;this.msg = msg;this.cityId = cityId;this.cityName = cityName;this.cityDescribe = cityDescribe;}public boolean isSuccess() {return success;}public void setSuccess(boolean success) {this.success = success;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Long getCityId() {return cityId;}public void setCityId(Long cityId) {this.cityId = cityId;}public String getCityName() {return cityName;}public void setCityName(String cityName) {this.cityName = cityName;}public String getCityDescribe() {return cityDescribe;}public void setCityDescribe(String cityDescribe) {this.cityDescribe = cityDescribe;}@Overridepublic String toString() {return "City04Response(" + "success=" + success + ", msg=" + msg + ", cityId=" + cityId + ", cityName=" + cityName + ", cityDescribe=" + cityDescribe + ")";}
}
1.5.2普通Java类的Builder类
public class City04ResponseBuilder implements Serializable {private boolean success;private String msg;private Long cityId;private String cityName;private String cityDescribe;public City04ResponseBuilder setSuccess(boolean success) {this.success = success;return this;}public City04ResponseBuilder setMsg(String msg) {this.msg = msg;return this;}public City04ResponseBuilder setCityId(Long cityId) {this.cityId = cityId;return this;}public City04ResponseBuilder setCityName(String cityName) {this.cityName = cityName;return this;}public City04ResponseBuilder setCityDescribe(String cityDescribe) {this.cityDescribe = cityDescribe;return this;}public City04Response build() {return new City04Response(success, msg, cityId, cityName, cityDescribe);}
}
1.6测试
public class UseBuildUtils {public static void main(String[] args) {City02Response city02Response;System.out.println("原生的Builder的Java对象,City02Response的Builder使用:");city02Response = City02Response.builder().success(true).msg("获取城市信息成功").cityId(20230328L).cityName("杭州").cityDescribe("杭州是一个互联网城市").build();System.out.println("City02Response直接使用builder: " +city02Response.toString());city02Response = City02Response.getCityInfoSuccess(20230328L, "杭州", "杭州是一个互联网城市");System.out.println("City02Response获取成功: " +city02Response.toString());city02Response = City02Response.getCityInfoFail(20230328L, "网络异常,无法获取信息");System.out.println("City02Response获取失败: " +city02Response.toString());City03Response city03Response;System.out.println("基于注解@Data和@Builder的Java对象,city03Response的Builder使用:");city03Response = City03Response.builder().success(true).msg("获取城市信息成功").cityId(20230328L).cityName("苏州").cityDescribe("工业城市").build();System.out.println("city03Response直接使用builder: " +city03Response.toString());city03Response = City03Response.getCityInfoSuccess(20230328L, "苏州", "工业城市");System.out.println("city03Response获取成功: " +city03Response.toString());city03Response = City03Response.getCityInfoFail(20230328L, "网络异常,无法获取信息");System.out.println("city03Response获取失败: " +city03Response.toString());System.out.println("普通Java类和Builder类分开场景的Builder使用:");City04Response city04Response = new City04ResponseBuilder().setSuccess(true).setMsg("获取城市信息成功").setCityId(20230328L).setCityName("宁波").setCityDescribe("港口城市").build();System.out.println("city04Response获取成功:"+city04Response.toString());}
}
原生的Builder的Java对象,City02Response的Builder使用:
City02Response直接使用builder: City02Response(success=true, msg=获取城市信息成功, cityId=20230328, cityName=杭州, cityDescribe=杭州是一个互联网城市)
City02Response获取成功: City02Response(success=true, msg=获取城市信息成功, cityId=20230328, cityName=杭州, cityDescribe=杭州是一个互联网城市)
City02Response获取失败: City02Response(success=false, msg=网络异常,无法获取信息, cityId=20230328, cityName=null, cityDescribe=null)基于注解@Data和@Builder的Java对象,city03Response的Builder使用:
city03Response直接使用builder: City03Response(success=true, msg=获取城市信息成功, cityId=20230328, cityName=苏州, cityDescribe=工业城市)
city03Response获取成功: City03Response(success=true, msg=获取城市信息成功, cityId=20230328, cityName=苏州, cityDescribe=工业城市)
city03Response获取失败: City03Response(success=false, msg=网络异常,无法获取信息, cityId=20230328, cityName=null, cityDescribe=null)普通Java类和Builder类分开场景的Builder使用:
city04Response获取成功:City04Response(success=true, msg=获取城市信息成功, cityId=20230328, cityName=宁波, cityDescribe=港口城市)
相关文章:
Java类的Builder应用以及使用@Data和@Builder高效应用Builder
⭐Java Builder模式:是Java设计模式之一,它属于对象创建型模式,是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 结论一:使用lombok的Data和Builder注解构建Java类的Builder简洁高效&am…...

【Qt控件之QTabWidget】介绍及使用
描述 QTabWidget类提供了一个带有选项卡的小部件堆栈。 选项卡小部件提供了一个选项卡栏(参见QTabBar)和一个“页面区域”,用于显示与每个选项卡相关联的页面。默认情况下,选项卡栏显示在页面区域的上方,但可以使用…...

Linux实战——网络连接模式的三种模式
Linux可以分为三种网络模式: 桥接模式 (vmnet0) 仅主机模式 (vmnet1) NAT模式 (vmnet8) 当我们下载了vmware之后,在电脑会出现两个虚拟网卡,VMware Network Adapter VMnet1、VMware Network Adapter VMnet8。 可以通过查找 控…...

嵌入式实时操作系统的设计与开发(任意大小的内存管理)
任意大小的内存管理是根据用户需要为其分配内存,即用户需要多大内存就通过acoral_malloc2()为之分配多大内存,同时每块分配出去的内存前面都有一个控制块,控制块里记录了该块内存的大小。 同时未分配出去的内存也有一个控制块,寻…...

文件读取结束的判定
大家好啊,我们今天来补充文件操作的读取结束的判定。 被错误使用的feof 牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾…...
《基于 Vue 组件库 的 Webpack5 配置》9.module.exports 可为数组类型且注意编译顺序
module.exports常见是对象类型,其实也可用数组类型;注意编译顺序,从后往前 编: 也就是说先编 another.js,再编 index.js;所以代码第 9 行不能设置为 true,仅在第一次,也就是代码第19…...
CUDA学习笔记(四)device管理
本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/,仅用于学习。 device管理 NVIDIA提供了集中凡是来查询和管理GPU device,掌握GPU信息查询很重要,因为这可以帮助你设置kernel的执行配置。 本博文将主要介绍下面两方面内容&…...

【算法练习Day25】 重新安排行程N 皇后 解数独
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 重新安排行程N 皇后解数独总…...

软考-访问控制技术原理与应用
本文为作者学习文章,按作者习惯写成,如有错误或需要追加内容请留言(不喜勿喷) 本文为追加文章,后期慢慢追加 by 2023年10月 访问控制概念 访问控制是计算机安全的一个重要组成部分,用于控制用户或程序如…...

优测云测试平台 | 有效的单元测试
一、前言 本文作者提出了一种评价单元测试用例的质量的思路,即判断用例是否达到测试的“四大目标”。掌握识别好的用例的能力,可以帮助我们高效地写出高质量的测试用例。 评判冰箱的好坏,并不需要有制造一台冰箱的能力。在开始写测试用例之…...

Java设计模式之外观模式
定义 又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,…...
MyBatis实现延时加载的方式
MyBatis实现延时加载的方式有两种: 使用resultMap的association和collection标签配置延时加载:在查询语句中,使用association标签配置一对一关联关系,使用collection标签配置一对多关联关系。然后在查询结果映射的resultMap中配置…...

计算未来:微软眼中的人工智能
计算未来 :人工智能及其社会角色(The Future Computed. Artificial Intelligence and its role in society )这本书于2018年09月由北京大学出版社出版。 书籍的作者是:沈向洋(微软全球执行副总裁),(美&…...
字号和磅的对应关系
字号「八号」对应磅值5 字号「七号」对应磅值5.5 字号「小六」对应磅值6.5 字号「六号」对应磅值7.5 字号「小五」对应磅值9 字号「五号」对应磅值10.5 字号「小四」对应磅值12 字号「四号」对应磅值14 字号「小三」对应磅值15 字号「三号」对应磅值16 字号「小二」对应磅值18 …...

Bag of Tricks for Efficient Text Classification(FastText)
主要的有点就是快,用途就是用于文本分类,模型结构如上,主要是通过embedding将文本转换成向量,然后进行mean-pooling,然后输入到hidden隐向量中,通过softmax输出多分类,损失函数是对数似然损失函…...

vue elementUI form组件动态添加el-form-item并且动态添加rules必填项校验方法
vue elementUI form组件动态添加el-form-item并且动态添加rules必填项校验方法 先看一下效果图(想在表单里动态的增删 form-item,然后添加rules,校验其必填项; ): html部分 <div v-for"(item, index) in …...

使用 ClickHouse 深入了解 Apache Parquet (一)
【squids.cn】 全网zui低价RDS,免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 自2013年作为Hadoop的列存储发布以来,Parquet几乎已经成为一种无处不在的文件交换格式,它提供了高效的存储和检索。这种采纳使其成为更近期的…...

【每周一测】Java阶段二第四周学习
目录 1、request中的getParameter(String name)方法的功能是 2、request中的getParameter(String name)方法的功能是 3、spring创建bean对象没有以下哪个方式 4、spring依赖注入中没有以下哪个方式 5、RequestParam、RequestBody、PathVariable的应用场景及区别 6、Cooki…...

系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第四部分:微服务架构
本心、输入输出、结果 文章目录 系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第四部分:微服务架构前言典型的微服务架构是什么样的微服务的优势 微服务最佳实践在开发微服务时,我们需要遵循以下最佳实践: 微服务通常使用什么技术堆栈…...

顺序表ArrayList
作者简介: zoro-1,目前大二,正在学习Java,数据结构等 作者主页: zoro-1的主页 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 顺序表 概念Arraylist构造方法相关方法遍历操作 自…...
【Linux】SSH:免密登录
配置 SSH 的免密登录(基于公钥认证)可实现无需输入密码即可登录远程主机,常用于自动化脚本、服务器集群、DevOps 等场景。 生成本地 SSH 密钥对(若尚未存在) 在本地客户端执行: ssh-keygen -t rsa -b 409…...
Java线程工厂:定制线程的利器
在Java中,线程工厂(Thread Factory)是一个创建新线程的工厂。它提供了一种方式,允许你在创建线程时定制线程的属性,比如设置线程名称、线程的优先级、守护线程属性等。 线程工厂的主要目的是将线程的创建逻辑从使用线…...
2种官方方法关闭Windows防火墙
2种官方方法关闭Windows防火墙 引言一、防火墙:你电脑的"智能安检员"二、这些场景,可能需要"临时撤防"三、极速关闭方案方法一:通过系统设置(Win10/11专属通道)方法二:通过传统控制面板(全系统通用:Win7-11全系)四、 必读安全警告(关闭前请三思!…...
Ref vs. Reactive:Vue 3 响应式变量的最佳选择指南
Ref vs. Reactive:Vue 3 响应式变量的最佳选择指南 在 Vue 3 的 Composition API 中,ref 和 reactive 是创建响应式数据的两种主要方式。许多开发者经常困惑于何时使用哪种方式。本文将深入对比两者的差异,帮助您做出最佳选择。 核心概念解…...

前端文件下载常用方式详解
在前端开发中,实现文件下载是常见的需求。根据不同的场景,我们可以选择不同的方法来实现文件流的下载。本文介绍三种常用的文件下载方式: 使用 axios 发送 JSON 请求下载文件流使用 axios 发送 FormData 请求下载文件流使用原生 form 表单提…...

Linux编程:2、进程基础知识
一、进程基本概念 1、进程与程序的区别 程序:静态的可执行文件(如电脑中的vs2022安装程序)。进程:程序的动态执行过程(如启动后的vs2022实例),是操作系统分配资源的单位(如 CPU 时…...

[TIP] Ubuntu 22.04 配置多个版本的 GCC 环境
问题背景 在 Ubuntu 22.04 中安装 VMware 虚拟机时,提示缺少 VMMON 和 VMNET 模块 编译这两个模块需要 GCC 的版本大于 12.3.0,而 Ubuntu 22.04 自带的 GCC 版本为 11.4.0 因此需要安装对应的 GCC 版本,但为了不影响其他程序,需…...

前端vue3 上传/导入文件 调用接口
点击按钮导入: <el-uploadaction"https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15":auto-upload"false":on-change"handleFileChange":show-file-list"false"><el-button type"warning"…...
服务器新建用户无法使用conda
服务器新建用户无法使用conda 1.将.bashrc文件复制到新用户家目录下 sudo cp .bashrc /home/newuser/.bashrc2.source命令激活该文件 source ~/.bashrc3.将.condarc文件复制到新用户家目录下 sudo cp .condarc/home/newuser/.condarc...

[面试精选] 0104. 二叉树的最大深度
文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 104. 二叉树的最大深度 - 力扣(LeetCode) 2. 题目描述 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点…...