简述

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的用法的更多相关文章

  1. 链式编程:遇到多个构造器参数(Constructor Parameters)时要考虑用构建器(Builder)

    public class NutritionFacts { private final int servingSize; private final int servings; private fin ...

  2. python注解(装饰器)的用法

    带参数的要用三层def,第一层写注解里的参数,第二层写函数,第三层写具体逻辑. 如果是不带参数的注解,直接使用后两层即可 def needPermission(permissionstr): def ...

  3. 遇到多个构造器参数时要考虑用构建器 builder 模式 JavaBean 线程安全

    effective java p9 JavaBeans模式阻止了把类做成不可变的可能,这需要程序员付出额外的努力来确保它的线程安全.

  4. effective java之使用构建器来创建对象

    第二章第2条:遇到多个构造器参数时要考虑使用构建器(builder) 就是建造者模式(不直接生成想要的对象,而是让客户端利用所有有必要的参数调用构造器或者静态工厂)直接上代码 package com. ...

  5. 【转】通过lombok带你读透Builder构建器

    原地址:https://www.jianshu.com/p/0d8fc3df3647?from=timeline&isappinstalled=0 很久之前,我在<effective j ...

  6. spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,guava限流,定时任务案例, 发邮件

    本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...

  7. 设计模式---对象创建模式之构建器模式(Builder)

    一:概念 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象 ...

  8. 构造器参数过多时考虑使用构建器(Builder)

    一.静态工厂和构造器的局限性 面对需要大量可选参数才能构建对象时,静态工厂和构造器并不能随着可选参数的增加而合理扩展. 假设创建一个类Person需要使用大量的可选参数,其中两个参数是必填的,剩下的都 ...

  9. Java设计模式:Builder(构建器)模式

    概念定义 Builder模式是一步一步创建一个复杂对象的创建型模式.该模式将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来. 应用场景 对象创建过程比较复杂,或对创建顺序或组合有依 ...

  10. spring boot 使用拦截器,注解 实现 权限过滤

    http://www.cnblogs.com/zhangXingSheng/p/7744997.html spring boot 使用拦截器 实现 用户登录拦截 http://www.cnblogs. ...

随机推荐

  1. 记一次线上Redis内存占用过高、大Key问题的排查

    问题背景 在一个风和日丽的下午,公司某项目现场运维同学反馈,生产环境3个Redis的Sentinel集群节点内存占用都很高,达到了17GB的内存占用量. 稍加思索,应该是某些Key的Value数据体量 ...

  2. vue 安装教程(如何在node环境下搭建vue项目)

    如果要配置node.js环境请查看(node.js环境在Window和Mac中配置,以及安装cnpm和配置Less环境)在终端输入命令 cnpm -v出现版本号 1.安装vue    window : ...

  3. 零知识证明: Tornado Cash 项目学习

    前言 最近在了解零知识证明方面的内容,这方面的内容确实不好入门也不好掌握,在了解了一些基础的概念以后,决定选择一个应用了零知识证明的项目来进行进一步的学习.最终选择了 Tornado Cash 这个项 ...

  4. idea推送代码忽略指定文件,文件夹配置

    idea推送代码忽略指定文件,文件夹配置 今天碰到一个问题,配置了.gitignore文件后没有生效,整了半天,最后发现一种直接配置的方法,可以指定文件夹,或者指定文件类型 打开设置

  5. DP-Modeler三维修模软件简介

    图像快速建模系统DP-Modeler是天际航自主研发的一款集精细化单体建模及Mesh网格模型修饰于一体的新型软件.通过特有的摄影测量算法,支持航测摄影.无人机影像.地面影像.车载影像.激光点云等多数据 ...

  6. MyBatis日志模块源码分析

    MyBatis源码的logging包下是日志模块的相关实现,Mybatis日志模块通过适配器模式和代理模式优雅的实现了SQL日志的输出功能. 一. 适配器模式实现了MyBatis对第三方日志框架的适配 ...

  7. django---展示多级评论

    实现原理: 在页面加载完成后,jQuery调用initComments()函数,initComments()函数会向后端发起Ajax请求,后端收到请求后,会把所有评论的数据以JSON格式返回到前端,然 ...

  8. golang 怎样防止结构体对象被拷贝

    主要实现Lock以及Unlock就可以了 此时使用go vet mian.go 检查就会提示我们./main1.go:25:7: assignment copies lock value to b: ...

  9. ChatGPT还是有点东西的-public static <T> List<T> Arrays.asList(T... a) {...}

    背景 业务开发需要判断业务状态是否在30.40.50.60的集合内,所以写了以下代码 int[] inLiq = {30,40,50,60}; return Arrays.asList(inLiq). ...

  10. Js实现任意位置缩放图片,深入理解背后原理

    前言 本文将用一个简单的例子详细讲解如何用原生JS一步步实现完整的任意位置缩放图片功能,无任何第三方依赖,指针事件 进行多端统一的事件监听,干货满满. 完整代码 为提升阅读体验,正文中代码展示有部分省 ...