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

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模式&#xff1a;是Java设计模式之一&#xff0c;它属于对象创建型模式&#xff0c;是将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 结论一&#xff1a;使用lombok的Data和Builder注解构建Java类的Builder简洁高效&am…...

【Qt控件之QTabWidget】介绍及使用

描述 QTabWidget类提供了一个带有选项卡的小部件堆栈。 选项卡小部件提供了一个选项卡栏&#xff08;参见QTabBar&#xff09;和一个“页面区域”&#xff0c;用于显示与每个选项卡相关联的页面。默认情况下&#xff0c;选项卡栏显示在页面区域的上方&#xff0c;但可以使用…...

Linux实战——网络连接模式的三种模式

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

嵌入式实时操作系统的设计与开发(任意大小的内存管理)

任意大小的内存管理是根据用户需要为其分配内存&#xff0c;即用户需要多大内存就通过acoral_malloc2()为之分配多大内存&#xff0c;同时每块分配出去的内存前面都有一个控制块&#xff0c;控制块里记录了该块内存的大小。 同时未分配出去的内存也有一个控制块&#xff0c;寻…...

文件读取结束的判定

大家好啊&#xff0c;我们今天来补充文件操作的读取结束的判定。 被错误使用的feof 牢记&#xff1a;在文件读取过程中&#xff0c;不能用feof函数的返回值直接用来判断文件的是否结束而是应用于当文件读取结束的时候&#xff0c;判断是读取失败结束&#xff0c;还是遇到文件尾…...

《基于 Vue 组件库 的 Webpack5 配置》9.module.exports 可为数组类型且注意编译顺序

module.exports常见是对象类型&#xff0c;其实也可用数组类型&#xff1b;注意编译顺序&#xff0c;从后往前 编&#xff1a; 也就是说先编 another.js&#xff0c;再编 index.js&#xff1b;所以代码第 9 行不能设置为 true&#xff0c;仅在第一次&#xff0c;也就是代码第19…...

​CUDA学习笔记(四)device管理

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/&#xff0c;仅用于学习。 device管理 NVIDIA提供了集中凡是来查询和管理GPU device&#xff0c;掌握GPU信息查询很重要&#xff0c;因为这可以帮助你设置kernel的执行配置。 本博文将主要介绍下面两方面内容&…...

【算法练习Day25】 重新安排行程N 皇后 解数独

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 重新安排行程N 皇后解数独总…...

软考-访问控制技术原理与应用

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 by 2023年10月 访问控制概念 访问控制是计算机安全的一个重要组成部分&#xff0c;用于控制用户或程序如…...

优测云测试平台 | 有效的单元测试

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

Java设计模式之外观模式

定义 又名门面模式&#xff0c;是一种通过为多个复杂的子系统提供一个一致的接口&#xff0c;而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口&#xff0c;外部应用程序不用关心内部子系统的具体的细节&#xff0c;这样会大大降低应用程序的复杂度&#xff0c;…...

MyBatis实现延时加载的方式

MyBatis实现延时加载的方式有两种&#xff1a; 使用resultMap的association和collection标签配置延时加载&#xff1a;在查询语句中&#xff0c;使用association标签配置一对一关联关系&#xff0c;使用collection标签配置一对多关联关系。然后在查询结果映射的resultMap中配置…...

计算未来:微软眼中的人工智能

计算未来 :人工智能及其社会角色&#xff08;The Future Computed. Artificial Intelligence and its role in society &#xff09;这本书于2018年09月由北京大学出版社出版。 书籍的作者是&#xff1a;沈向洋&#xff08;微软全球执行副总裁&#xff09;,&#xff08;美&…...

字号和磅的对应关系

字号「八号」对应磅值5 字号「七号」对应磅值5.5 字号「小六」对应磅值6.5 字号「六号」对应磅值7.5 字号「小五」对应磅值9 字号「五号」对应磅值10.5 字号「小四」对应磅值12 字号「四号」对应磅值14 字号「小三」对应磅值15 字号「三号」对应磅值16 字号「小二」对应磅值18 …...

Bag of Tricks for Efficient Text Classification(FastText)

主要的有点就是快&#xff0c;用途就是用于文本分类&#xff0c;模型结构如上&#xff0c;主要是通过embedding将文本转换成向量&#xff0c;然后进行mean-pooling&#xff0c;然后输入到hidden隐向量中&#xff0c;通过softmax输出多分类&#xff0c;损失函数是对数似然损失函…...

vue elementUI form组件动态添加el-form-item并且动态添加rules必填项校验方法

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

使用 ClickHouse 深入了解 Apache Parquet (一)

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

【每周一测】Java阶段二第四周学习

目录 1、request中的getParameter(String name)方法的功能是 2、request中的getParameter(String name)方法的功能是 3、spring创建bean对象没有以下哪个方式 4、spring依赖注入中没有以下哪个方式 5、RequestParam、RequestBody、PathVariable的应用场景及区别 6、Cooki…...

系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第四部分:微服务架构

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

顺序表ArrayList

作者简介&#xff1a; zoro-1&#xff0c;目前大二&#xff0c;正在学习Java&#xff0c;数据结构等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 顺序表 概念Arraylist构造方法相关方法遍历操作 自…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...