Spring注解之构建器@Builder的用法
简述
Builder使用创建者模式又叫建造者模式。简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程。
基础使用
@Builder 注解为你的类生成相对略微复杂的构建器API。
@Builder 可以让你以下面显示的那样调用你的代码,来初始化你的实例对象:
Student.builder().sno("001").sname("admin").sage(18).sphone("110").build();
使用场景
遇到多个构造器参数时可以考虑使用构建器
如果已知将来可能需要添加很多的参数,通常一开始就使用构建器。
重叠构造器
平时都习惯使用重叠构造器(telescoping constructor)模式,在这种模式下,提供的第一个构造器只有必要的参数,第二个构造器有一个可选参数,第三个构造器有两个可选参数,依次类推,最后一个构造器包含所有可选的参数。
下面有个示例:
@Data
public class Person {
private String name; // 必填属性
private String age; // 选填属性
private String sex; // 选填属性
private String country; // 选填属性
public Person(String name) {
this(name, null);
}
public Person(String name, String age) {
this(name, age, null);
}
public Person(String name, String age, String sex) {
this(name, age, sex, null);
}
public Person(String name, String age, String sex, String country) {
this.name = name;
this.age = age;
this.sex = sex;
this.country = country;
}
}
当创建实例时,可以根据实际参数情况,选择使用具体的构造器,如下所示。
Person person = new Person("张三");
Person person1 = new Person("李四", "12");
JavaBeans模式
遇到许多可选的构造器参数的时候,还有第二种替代方法,即 JavaBeans 模式,在这种模式下,先调用一个无参构造器来创建对象,然后再调用 setter 方法来设置每个必要的参数,以及每个相关的可选参数。
创建实例如下:
Person person = new Person();
person.setName("张三");
person.setAge("23");
person.setSex("男");
建造者(Builder)模式
建造者模式既能保证像重叠构造器模式那样的安全性,也能保证像 Java Beans 模式那么好的可读性。
它不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器,得到一个 builder 对象。然后客户端在 builder 对象上调用类似于 setter 的方法,来设置每个相关的可选参数。最后,客户端调用无参的 build 方法来生成通常是不可变的对象。这个 builder 通常是它构建的静态成员类。
建造者模式代码示例:使用@Builder注解即可
@Builder
public class User {
// 设置初始值
@Builder.Default
private final Integer id = UUID.randomUUID().toString();
private final Integer code = 200;
private String username;
private String password;
// value 修改添加集合元素的方法名
@Singular(value = "hobby")
private List<String> hobbies;
@Builder.Default
private long insertTime = System.currentTimeMillis();
}
创建实例如下:
User user = User.Builder().username("admin").password("123456").hobby("张三").hobby("李四").build();
1、@Builder.Default 的使用
当我在使用这个实体对象时,我就不需要在为这两个字段进行初始化值
当然,你如果再对这两个字段进行设值的话,那么默认定义的值将会被覆盖掉
2、@Singular 关于集合操作的三个方法:
hobby(String hobby) :向集合中添加一个元素
hobbies(Collection<? extends String> hobbies) :添加一个集合所有的元素
clearHobbies() :清空当前集合数据
3、@Builder(toBuilder=true)
默认false,为 ture 时可以修改这个对象属性值
示例:
// 创建一个新的对象user2,原来的对象属性是不可变的,并修改了密码,且list在原来基础上新增一个"老六"
User user2 = user.toBuilder().hobby("老六").password("888").build();
如果想改变原来对象的属性,还可以给这个实体类再添加上 @Data 或者 @setter 方法。
@Builder内部帮我们做了什么?
1、创建一个名为 ThisClassBuilder 的内部静态类,并具有和实体类形同的属性(称为构建器)。
2、在构建器中:对于目标类中的所有的属性和未初始化的 final 字段,都会在构建器中创建对应属性。
3、在构建器中:创建一个无参的 default 构造函数。
4、在构建器中:对于实体类中的每个参数,都会对应创建类似于 setter 的方法,只不过方法名与该参数名相同。 并且返回值是构建器本身(便于链式调用),如上例所示。
5、在构建器中:一个 build() 方法,调用此方法,就会根据设置的值进行创建实体对象。
6、在构建器中:同时也会生成一个 toString() 方法。
7、在实体类中:会创建一个 builder() 方法,它的目的是用来创建构建器。
@Builder 全局配置
# 是否禁止使用@Builder
lombok.builder.flagUsage = [warning | error] (default: not set)
# 是否使用Guaua
lombok.singular.useGuava = [true | false] (default: false)
# 是否自动使用singular,默认是使用
lombok.singular.auto = [true | false] (default: true)
使用总结
Builder 模式模拟了具名的可选参数。与构造器相比,builder 的略微优势在于,它可以有多个可变参数,因为 builder 是利用单独的方法来设置每一个参数。
Builder 模式也有它自身的不足。为了创建对象,必须先创建它的构建器。
Builder 模式还比重叠构造器模式更加冗长,因此它只有在很多参数的时候才使用。
简而言之,如果类的构造器或者静态工厂中具有多个参数,设计这种类时,Builder 模式就是一种不错的选择,特别是当大多数参数都是可选或者类型相同的时候。
与使用重叠构造器模式相比,使用 Builder 模式的客户端代码将更易于阅读和编写,构建器也比 Java Beans 更加安全。
Spring注解之构建器@Builder的用法的更多相关文章
- 链式编程:遇到多个构造器参数(Constructor Parameters)时要考虑用构建器(Builder)
public class NutritionFacts { private final int servingSize; private final int servings; private fin ...
- python注解(装饰器)的用法
带参数的要用三层def,第一层写注解里的参数,第二层写函数,第三层写具体逻辑. 如果是不带参数的注解,直接使用后两层即可 def needPermission(permissionstr): def ...
- 遇到多个构造器参数时要考虑用构建器 builder 模式 JavaBean 线程安全
effective java p9 JavaBeans模式阻止了把类做成不可变的可能,这需要程序员付出额外的努力来确保它的线程安全.
- effective java之使用构建器来创建对象
第二章第2条:遇到多个构造器参数时要考虑使用构建器(builder) 就是建造者模式(不直接生成想要的对象,而是让客户端利用所有有必要的参数调用构造器或者静态工厂)直接上代码 package com. ...
- 【转】通过lombok带你读透Builder构建器
原地址:https://www.jianshu.com/p/0d8fc3df3647?from=timeline&isappinstalled=0 很久之前,我在<effective j ...
- spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,guava限流,定时任务案例, 发邮件
本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...
- 设计模式---对象创建模式之构建器模式(Builder)
一:概念 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象 ...
- 构造器参数过多时考虑使用构建器(Builder)
一.静态工厂和构造器的局限性 面对需要大量可选参数才能构建对象时,静态工厂和构造器并不能随着可选参数的增加而合理扩展. 假设创建一个类Person需要使用大量的可选参数,其中两个参数是必填的,剩下的都 ...
- Java设计模式:Builder(构建器)模式
概念定义 Builder模式是一步一步创建一个复杂对象的创建型模式.该模式将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来. 应用场景 对象创建过程比较复杂,或对创建顺序或组合有依 ...
- spring boot 使用拦截器,注解 实现 权限过滤
http://www.cnblogs.com/zhangXingSheng/p/7744997.html spring boot 使用拦截器 实现 用户登录拦截 http://www.cnblogs. ...
随机推荐
- Python第三方库的安装和导入
目录 一.Python第三方库的安装 1. 使用pip命令行安装 2. 使用PyCharm进行安装 3. 下载第三方库文件到本地进行安装 4. 通过国内源进行安装 二.Python第三方库的导入 1. ...
- Django国际化与本地化指南
title: Django国际化与本地化指南 date: 2024/5/12 16:51:04 updated: 2024/5/12 16:51:04 categories: 后端开发 tags: D ...
- OpenNESS & OpenVINO Demo 部署
目录 文章目录 目录 部署架构 部署 Edge Controller 基础配置 配置 Proxy 配置防火墙 Install necessary package Install MySQL Insta ...
- containerd 源码分析:kubelet 和 containerd 交互
0. 前言 Kubernetes:kubelet 源码分析之创建 pod 流程 介绍了 kubelet 创建 pod 的流程,其中介绍了 kubelet 调用 runtime cri 接口创建 pod ...
- linux中磁盘清理方法(简单好用)
文章目录1.命令2.df参数说明3.find参数说明4.清理日志文件1.命令先来看解决办法 df -h --显示当前磁盘使用情况cd / --cd到要清理文件的路径下面find . -type f - ...
- Win11安装VMware Workstation Pro,Centos,Xshell,Xftp(Linux学习需要)
注意:1.win11不能安装太低版本的VMware Workstation Pro,否则启动linux会出现蓝屏 2.win11是默认没有开虚拟机平台支持的,所以同时也要开启,否则也会出现蓝屏. ...
- 8.4考试总结(NOIP模拟30)[毛一琛·毛二琛·毛三琛]
最有名的莫过于想死一次吗. 前言 至今都不知道题目是个啥... T1 毛一琛 解题思路 \(\mathcal{Meet\;In\;The\;Middle}\) 其实就是一个爆搜... 把整个区间分为两 ...
- Web 页面性能衡量指标-以用户为中心的效果指标
Web 页面性能衡量指标-以用户为中心的性能指标 以用户为中心的性能指标是理解和改进站点体验的关键点 一.以用户为中心的性能指标 1. 指标是用来干啥的? 指标是用来衡量性能和用户体验的 2. 指标类 ...
- 为何Mysql数据库上读和代码读取的数据不一致
上周,做了一个同步删除的功能,具体流程是,数据库删除-->调用第三方运行删除接口,同步删除. 具体流程 数据库删除数据后,这里使用标志删除,再调用第三方数据. 在调用第三方数据之前需要通过id查 ...
- 再谈中断机制(APIC)
中断是硬件和软件交互的一种机制,可以说整个操作系统,整个架构都是由中断来驱动的.一个中断的起末会经历设备,中断控制器,CPU 三个阶段:设备产生中断信号,中断控制器翻译信号,CPU 来实际处理信号. ...