Lombok中的@Builder注解
1.前言
今天在看项目代码的时候, 遇到了实体类上加@Builder注解, 之前在开发的时候, 一直没有用过这个注解, 便兴致勃勃地去查了一下资料, 它也是Lombok中的注解, 我们都知道Lombok的注解是在java代码进行编译时对代码进行构建. Lombok插件的出现, 使得开发人员无需写多余的重复代码, 对于java对象的创建更是提供了Builder方法, 使得开发人员在设计实体类的时候, 对外保持private setter, 而对属性的赋值采用Builder方式, 不对外公开属性的写操作, 这种方式更加优雅, 并且符合面向对象编程的封装原则.
2.pom.xml的引入
1 <dependency>
2 <groupId>org.projectlombok</groupId>
3 <artifactId>lombok</artifactId>
4 <version>1.18.12</version>
5 </dependency>
3.@Builder注解的应用
1 /**
2 * @author lyh
3 * @version v-1.0.0
4 * @since 2021/6/3
5 */
6 public class TestBuilder {
7 public static void main(String[] args) {
8
9 // 使用Builder注解来创建一个User实例
10 User zs = User.builder()
11 .age(15)
12 .name("zs").build();
13 System.out.println(zs);
14
15 /**
16 * 修改原对象的属性值
17 * 注意: 修改实体, 要在实体的@Builder注解里面设置toBuilder = true
18 * toBuilder的默认值是false,这个可以自行去查看@Builder注解类的实现
19 * 里面有这样一行代码:
20 * boolean toBuilder() default false;
21 */
22 zs = zs.toBuilder()
23 .age(18).build();
24 System.out.println(zs);
25
26 }
27 }
28
29 输出:
30 User(name=zs, age=15)
31 User(name=zs, age=18)
32
33 Process finished with exit code 0
1 @Builder
2 @Getter
3 @ToString
4 public class User {
5
6 private String name;
7
8 private Integer age;
9
10 }
4.@Builder内部工作
先来看一下使用@Builder注解之后, User类编译后的代码:
1 public class User {
2 private String name;
3 private Integer age;
4
5 User(String name, Integer age) {
6 this.name = name;
7 this.age = age;
8 }
9
10 public static User.UserBuilder builder() {
11 return new User.UserBuilder();
12 }
13
14 public String getName() {
15 return this.name;
16 }
17
18 public Integer getAge() {
19 return this.age;
20 }
21
22 public String toString() {
23 return "User(name=" + this.getName() + ", age=" + this.getAge() + ")";
24 }
25
26 public static class UserBuilder {
27 private String name;
28 private Integer age;
29
30 UserBuilder() {
31 }
32
33 public User.UserBuilder name(String name) {
34 this.name = name;
35 return this;
36 }
37
38 public User.UserBuilder age(Integer age) {
39 this.age = age;
40 return this;
41 }
42
43 public User build() {
44 return new User(this.name, this.age);
45 }
46
47 public String toString() {
48 return "User.UserBuilder(name=" + this.name + ", age=" + this.age + ")";
49 }
50 }
51 }
通过上面编译后的User类代码可以看到@Builder的内部工作结果:
创建了一个名为UserBuilder的静态内部类, 并且具有和实体类相同的属性(称为构建器).
在构建器中: 对于目标类中的所有的属性, 都会在构建器中创建对应的属性.
在构建器中: 创建一个无参的default构造方法.
在构建器中: 对于实体类中的每个参数, 都会对应创建类似于setter方法, 但是方法名是与该参数名是相同的, 并且返回值是构建器本身(便于链式调用).
在构建器中: 一个build方法, 调用此方法, 就会根据设置的值进行创建对象实例.
在构建器中: 同时也会生成一个toString() 方法.
在构建器中: 会创建一个builder()方法, 它的目的是用来创建构建器.
Lombok中的@Builder注解的更多相关文章
- lombok 下的@Builder注解用法
pom依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId& ...
- 详解Lombok中的@Builder用法
Builder 使用创建者模式又叫建造者模式.简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程. 基础使用 @Builder注释为你的类生成相对略微复杂 ...
- java~lombok里的Builder注解
lombok注解在java进行编译时进行代码的构建,对于java对象的创建工作它可以更优雅,不需要写多余的重复的代码,这对于JAVA开发人员是很重要的,在出现lombok之后,对象的创建工作更提供Bu ...
- lombok中的@ToString注解作用
Lombok是一个很好的工具,节省了很多重写方法,而@ToString就是节省了ToString方法,lombok中@ToString就是节省了我们在模型中的冗余代码下面就来举个例子 import j ...
- lombok 中的@Data注解
今天看到有代码中的Dao包中的类文件,写的极其简洁,甚至引起了开发工具InteliJ的报错,然后程序还能稳健地跑起来. import lombok.Data; @Data public class V ...
- Java中lombok @Builder注解使用详解(十八)
Lombok大家都知道,在使用POJO过程中,它给我们带来了很多便利,省下大量写get.set方法.构造器.equal.toString方法的时间.除此之外,通过@Builder注解,lombok还可 ...
- lombok @Builder注解使用的例子、反编译之后的代码详解
lombok的@Builder实际是建造者模式的一个变种,所以在创建复杂对象时常使用 这里对lombok的@Builder和@Data组合的使用示例 import lombok.Builder; im ...
- Lombok之@Builder注解
Lombok之@Builder注解 前言 Lombok大家都知道,在使用POJO过程中,它给我们带来了很多便利,省下大量写get.set方法.构造器.equal.toString方法的时间.除此之外, ...
- 实体继承与@Builder注解共存
在面向对象的设计里,继承是非常必要的,我们会把共有的属性和方法抽象到父类中,由它统一去实现,而在进行lombok时代之后,更多的打法是使用@Builder来进行对象赋值,我们直接在类上加@Builde ...
随机推荐
- 浅入Kubernetes(10):控制节点的部署,选择器、亲和性、污点
目录 标签和nodeSelector 标签选择 亲和性和反亲和性 污点和容忍度 系统默认污点 容忍度 DaemonSet 在前面的学习中,我们学到了 Deployment 部署,以及副本数(Repli ...
- Day08_40_集合_List
List集合 List接口是继承Collection接口,所以Collection集合中有的方法,List集合也会继承过来,可以直接使用. All Superinterfaces: Collectio ...
- 整合Atomikos、Quartz、Postgresql的踩坑日记
前言 由于业务需要,在单体Spring Boot项目中需要引入分布式事务,来保证单体应用连接的多个数据源的事务统一. 而说到分布式事务,小伙伴们肯定会想到阿里的Seata,阿里Seata强大的AT模式 ...
- k8s deployment 金丝雀发布 更新的 暂停 恢复 回滚
假设现在有业务需求,计划将所有的nginx 从镜像版本1.14更新到1.15,这一次发布不紧需要平滑发布,还需要 金丝雀发布,及确认其中一个Pod没有问题后在进行剩余的更新. 暂停与恢复也可以使用ym ...
- 关于Redis客户端显示中文或中文乱码问题的解决
关于Redis客户端不显示中文或者显示中文乱码,网上有些解决办法不全面的,都是漏了步骤不讲,简直瞎扯.在此记录一下解决方式. 刚开始使用Redis客户端的时候,本身就是默认不支持显示中文的. 例如,进 ...
- Weblogic CVE-2020-2551漏洞复现
Weblogic CVE-2020-2551漏洞复现 0x00 前言 在一次渗透测试过程中,碰见了该漏洞,并使用在野的POC验证了这个漏洞存在,当时工具网传的利用方式去进行利用,没有成功,可能是自己太 ...
- 【JavaWeb】 Cookie和Session
Session和Cookie出现的原因: 由于Http是无状态的协议,会话之间没有任何关联,也就是上一次会话和下一次会话没有任何关联,因此出现了会话技术Cookie和Session 下面分别从Cook ...
- 关于Hexo博客NEXT主题(Gmini)站点图标不显示,显示错误的解决办法
关于Hexo博客NEXT主题(Gmini)站点图标不显示,显示错误的解决办法 最近闲着没事自己利用Hexo和Github搭了个博客,但是在NEXT(Gmini)主题优化时,出了很多错误,图标不显示 ...
- CTB-LOCKER敲诈者病毒下载器脱壳之样本1
一.病毒简介 CTB-LOCKER敲诈者病毒最初是在国外被发现的,该病毒是有两部分组成分别是下载器部分和文档加密部分.病毒作者将下载器程序部分伪装成邮件附件发送给一些大公司的员工或者高管,当这些人下载 ...
- Linux下的用户、组和权限
目录 一:用户和组信息的查看 查看用户信息 查看密码信息 查看组信息 特殊组wheel 二:用户和组信息的管理 用户管理 组管理 三:文件权限 文件权限的查看 文件权限的修改 ACL控制权限 setf ...