@Builder用法

一.场景模拟@Data两个缺点

假如有一结果api结果返回值的类Result,其在代码中频繁被使用:

@Data
public class Result<T> {private int code;private String message;private T data;public Result(int code, String message, T data) {this.code = code;this.message = message;this.data = data;}
}

如果要使用它,一般的方法是:

public class Main {public static void main(String[] args) {//方法1,使用全量的构造函数User result1 = new User( "你", "好");//方法2,使用空的构造函数加setter函数赋值User user = new User();user.setUsername("你");user.setPassword("好");}
}

这两种使用方法的弊端有:

(1)方法一:当只需要部分参数的时候需要再定义个构造函数(比如只要username,不要password),且一旦参数较多,则构造函数冗长;

(2)方法二:setter冗长;

因此我们需要builder来解决这个问题

二.java实现@builder

@Builder
public class User {private final Integer code = 200;private String username;private String password;
}// 编译后:
public class User {private String username;private String password;User(String username, String password) {this.username = username; this.password = password;}public static User.UserBuilder builder() {return new User.UserBuilder();}public static class UserBuilder {private String username;private String password;UserBuilder() {}public User.UserBuilder username(String username) {this.username = username;return this;}public User.UserBuilder password(String password) {this.password = password;return this;}public User build() {return new User(this.username, this.password);}public String toString() {return "User.UserBuilder(username=" + this.username + ", password=" + this.password + ")";}}
}
    public static void main(String[] args) {User user = User.builder().username("ni").password("44").build();System.out.println(user);//User(code=200, username=ni, password=44)}

三.@builder在内部帮我们做了什么

  • 创建一个名为ThisClassBuilder的内部静态类,并具有和实体类形同的属性(称为构建器)。
  • 在构建器中:对于目标类中的所有的属性和未初始化的final字段,都会在构建器中创建对应属性。
  • 在构建器中:创建一个无参的default构造函数。
  • 在构建器中:对于实体类中的每个参数,都会对应创建类似于setter的方法,只不过方法名与该参数名相同。 并且返回值是构建器本身(便于链式调用),如上例所示。
  • 在构建器中:一个build()方法,调用此方法,就会根据设置的值进行创建实体对象。
  • 在构建器中:同时也会生成一个toString()方法。
  • 在实体类中:会创建一个builder()方法,它的目的是用来创建构建器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755763.shtml

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

相关文章

AI换脸软件rope最新更新的蓝宝石中文版下载

rope换脸软件蓝宝石版下载地址&#xff1a;点击下载 最近AI软件非常的火爆&#xff0c;今天就给大家带来一个可以AI替换人脸的工具rope&#xff0c;得益于机器学习技术的不断发展&#xff0c;rope经过深度神经网络的无数次迭代优化&#xff0c;最终得出的模型可以自动学习和识…

如何在一个阶段中后期调整心态

在阶段中后期调整心态和自我鼓励的方法涉及心理调适、目标回顾、计划调整和积极心理暗示等多个层面。以下是一些建议&#xff1a; 回顾和调整目标&#xff1a; 回顾初始目标是否依然符合当前情境和自身需求&#xff0c;如有必要&#xff0c;适度调整目标使之更具可行性&#…

【商业成长】Ai 中英字幕:英伟达 NVIDIA GTC 黄仁勋——见证 AI 的变革时刻,听他分享塑造未来的 AI 突破!

英伟达官网&#xff1a;人工智能计算领域的领导者 | NVIDIA Ai 中英字幕 仅供学习使用&#xff0c;不得商用&#xff0c;侵删&#xff0c;感谢&#xff01; 【Ai 中英 舒适字幕】英伟达 NVIDIA GTC 黄仁勋&#xff1a;见证 AI 的变革时刻&#xff0c;听他分享塑造未来的 AI 突破…

2022蓝桥杯/李白打酒加强版/c\c++

问题描述 话说大诗人李白&#xff0c;一生好饮。幸好他从不开车。一天&#xff0c;他提着酒壶&#xff0c;从家里出来&#xff0c;酒壶中有酒2斗。他边走边唱&#xff1a;无事街上走&#xff0c;提壶去打酒。逢店加一倍&#xff0c;遇花喝一斗。这一路上&#xff0c;他一共遇到…

Linux调试器-gdb的使用

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 gdb简单基础指令Linux调试器-gdb使用背景调试准备工作写一个简单的myprocess.c程序makefile程序debug模式运行修改后的Makefile程序 调试(gdb)listruni…

Excalidraw:绘制图形的新利器

title: Excalidraw&#xff1a;绘制图形的新利器 date: 2024/3/19 17:18:08 updated: 2024/3/19 17:18:08 tags: 绘图工具多人协作数据安全简洁设计浏览器访问Docker部署插件扩展 摘要&#xff1a; Excalidraw是一款简洁设计、直观易用的绘图应用&#xff0c;用户可以通过它创…

C++中的this指针、访问控制和构造函数

C中的this指针、访问控制和构造函数 this指针 在C中&#xff0c;this指针是一个特殊的指针&#xff0c;它指向当前对象的地址。每个非静态成员函数&#xff08;包括成员函数模板&#xff09;都有一个this指针作为其隐含参数&#xff0c;这意味着在成员函数内部&#xff0c;th…

IO空间和内存空间的区别

1&#xff0c;IO空间&#xff1a;一个特有的空间&#xff0c;与内存空间独立的空间&#xff0c;同样利用IO空间可以操作数据&#xff0c;只不过是利用对应的IO端口操作函数。 2&#xff0c;内存空间&#xff1a;内存地址的寻址范围&#xff0c;例如32位操作系统内存空间为2的32…

【IJCAI】CostFormer即插即用的MVS高效代价体聚合Transformer,FaceChain团队出品

一、论文题目&#xff1a; CostFormer: Cost Transformer for Cost Aggregation in Multi-view Stereo&#xff0c;https://arxiv.org/abs/2305.10320 二、论文简介&#xff1a; 多视角立体是三维重建的一种重要实现方式&#xff0c;该方式会从一系列同一场景但不同视角的二维…

c++算法学习笔记 (10) 位运算

1.求n的二进制位表示中第k位是几&#xff1a; #include <iostream> using namespace std; int main() {int n 10;for (int i 3; i > 0; i--){ // 求n的第i位cout << ((n >> i) & 1) << " ";} // 输出1 0 1 0return 0; } 2.lowbit…

解析JS加密解密中的生成器构造

前言 之前JS解密的客户&#xff0c;有一部分代码里是有生成器构造出来代码&#xff0c;一些基础比较薄弱的客户以及技术就看起来比较费劲看不懂了&#xff0c;这里特意写一篇文章为这部分客户服务。尽量言简意赅&#xff0c;以下是示例代码&#xff1a; function YV(YD) {ret…

【动态规划】【 数位dp】2827. 范围中美丽整数的数目

本文涉及知识点 数位dp 动态规划汇总 LeetCode2827. 范围中美丽整数的数目 给你正整数 low &#xff0c;high 和 k 。 如果一个数满足以下两个条件&#xff0c;那么它是 美丽的 &#xff1a; 偶数数位的数目与奇数数位的数目相同。 这个整数可以被 k 整除。 请你返回范围 [l…

仿懂车帝的二手车交易平台功能介绍

二手车交易平台app是一款功能丰富的二手车交易平台&#xff0c;以下是其主要功能介绍&#xff1a; 二手车信息展示&#xff1a;APP首页展示各类二手车信息&#xff0c;包括车型、品牌、价格等&#xff0c;用户可以轻松浏览并选择自己感兴趣的车辆。搜索与筛选功能&#xff1a;…

Ethereum, BSC, Polygon, Arbitrum, Base, OPBNB 链打符文代码

Ethereum, BSC, Polygon, Arbitrum, Base, OPBNB 代码创建了一个 Web3 实例,并根据配置文件中的 RPC URL 和链 ID 连接到区块链。 3. 接下来,代码定义了一些变量,如发送者钱包地址、发送者私钥、接收者钱包地址和输入消息。 4. `UpdateBalance` 函数用于获取发送者钱包…

哈希技术解析:从哈希函数到哈希桶迭代器的全面指南

文章目录 引言一、哈希表与哈希函数1、哈希表的基本原理2、哈希函数的作用与特点3、哈希冲突的处理方法 二、哈希桶及其迭代器1、 哈希桶a.定义哈希桶结构b.哈希函数c.哈希桶的插入、查找、删除 2、 哈希桶的迭代器a.类型定义与成员变量b.构造函数c.解引用与比较操作d.递增操作…

Liunx进程间通信

进程间通信 进程间通信进程间通信的基本概念进程间通信的目的 管道匿名管道进程池 命名管道 system V进程间通信system V进程间通信基本概念system V共享内存共享内存和管道的对比 system V 信号量信号量同步和互斥 进程间通信 进程间通信的基本概念 进程间通信就是在不同进程…

6-LINUX-- C 程序的编译与调试

一.环境搭建 1.gcc的安装 1>.切换到管理员模式 sudo su ----> 输入密码 2>.apt install gcc //C语言的编译环境 3>.apt install g //c编译环境的搭建 4>.install update //软件升级 2.gcc分步编译链接 &#xff08;1&#xff09;预编译 gcc -E…

计算机生物科技在基因编辑中的应用及其前景

一、引言 基因编辑&#xff0c;作为一种能够精准修改生物体基因组的技术&#xff0c;近年来受到了广泛的关注。 而计算机生物科技作为连接计算机科学与生物学的桥梁&#xff0c;为基因编辑技术的快速发展提供了强大的支持。通过利用计算机算法和数据分析方法&#xff0c;研究人…

Dashe Media全球新闻稿发布协助您实现传播目标-海外媒体宣发

亚太区新闻稿发布网络 Dashe Media 是唯一一家于亚太区拥有专有记者网络和网上新闻媒体发布网络的全球新闻通讯社 Dashe Media 在该地区的 26 个国家拥有 200,000 名记者和编辑数据库&#xff0c;涵盖 500 个新闻类别、68,000 个新闻媒体和 1,500 个在线新闻媒体合作伙伴&…

合并两个 Git 仓库,保存所有提交记录

将两个 Git 代码库合并成一个同时保留修改记录的过程&#xff0c;可以通过几个步骤完成。 这里提供一种常见的方法&#xff0c;使用git remote和git merge命令来实现。 假设场景 代码库A&#xff1a;原始代码库&#xff0c;希望将另一个代码库合并到这个库中。代码库B&#…