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

@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()方法,它的目的是用来创建构建器。

相关文章:

  • Java微服务轻松部署服务器
  • 什么是DTO、VO、BO、PO、DO、POJO
  • 【Git版本控制系统】:起步
  • Linux之shell变量
  • LeetCode112 路径总和
  • 红帽认证可以直接考rhce嘛?红帽认证有效期多久?
  • Sora没体验资格?开源项目:Open-Sora,复现类Sora视频生成方案
  • Python库Gym:打开机器学习与强化学习的大门
  • JAVA八股day1
  • 学生时期学习资源同步-1 第一学期结业考试题8
  • 关于BFF
  • Echo框架:高性能的Golang Web框架
  • mysql笔记:19. 主从复制和主主复制
  • 由浅到深认识C语言(6):变量的存储类型
  • VS Code安装Live Server插件搭建web网页结合内网穿透实现公网访问
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【Linux系统编程】快速查找errno错误码信息
  • 2019.2.20 c++ 知识梳理
  • Angular 2 DI - IoC DI - 1
  • Java程序员幽默爆笑锦集
  • JS学习笔记——闭包
  • Just for fun——迅速写完快速排序
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • react-native 安卓真机环境搭建
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Vultr 教程目录
  • 程序员该如何有效的找工作?
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 第二十章:异步和文件I/O.(二十三)
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • (Git) gitignore基础使用
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (多级缓存)多级缓存
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (转载)OpenStack Hacker养成指南
  • . Flume面试题
  • .aanva
  • .md即markdown文件的基本常用编写语法
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Core 项目指定SDK版本
  • .net mvc 获取url中controller和action
  • .net web项目 调用webService
  • .NetCore项目nginx发布
  • .NET命令行(CLI)常用命令
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [2018-01-08] Python强化周的第一天
  • [E单调栈] lc2487. 从链表中移除节点(单调栈+递归+反转链表+多思路)
  • [loj#115] 无源汇有上下界可行流 网络流
  • [NOIP2014普及组]子矩阵
  • [objective-c]关于KVC--KVO--KVB