热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

探究lombok03@Builder使用

Java8org.springframework.boot2.7.3lombok1.18.24EclipseVersion:2022-09(4.25.0)--ben发布于博客园 上

Java 8

org.springframework.boot 2.7.3

lombok 1.18.24

Eclipse Version: 2022-09 (4.25.0)

--ben发布于博客园

 

上一篇:探究lombok-02-类继承

https://www.cnblogs.com/luo630/p/16941903.html

注,本文测试结果的 LombokMain.java 的代码与上一篇相同。ben发布于博客园

 


0、序章

使用 @Builder 后,可以使用 链式编程 方式构建对象(一般方法是使用 new)。ben发布于博客园

 

示例代码:UserBuilderVO类

import java.util.Date;
import java.util.List;
import lombok.Builder;
@Builder
public class UserBuilderVO {
private Integer id;
private String name;
private List tags;
private Date createTime;

}

 


1、仅@Builder

只使用 @Builder 的类分析结果:

测试:class=class com.lib.webdemo.vo.UserBuilderVO
----
prtClasses: length=1
内部类: com.lib.webdemo.vo.UserBuilderVO.UserBuilderVOBuilder, com.lib.webdemo.vo.UserBuilderVO$UserBuilderVOBuilder, UserBuilderVOBuilder, com.lib.webdemo.vo.UserBuilderVO$UserBuilderVOBuilder, modifiers=9
----
prtConstructors: length=1
构造方法名称:com.lib.webdemo.vo.UserBuilderVO, 参数数量:4, modifiers=0
----
prtFields: length=4
字段:id, type=class java.lang.Integer, modifiers=2
字段:name, type=class java.lang.String, modifiers=2
字段:tags, type=interface java.util.List, modifiers=2
字段:createTime, type=class java.util.Date, modifiers=2
----
prtMethods: length=1
方法名称:builder, 参数数量:0, modifiers=9

增加了一个内部类UserBuilderVOBuilder;

只有一个成员方法:builder。

 

UserBuilderVOBuilder 类分析结果(1):

test(UserBuilderVO.UserBuilderVOBuilder.class);

测试:class=class com.lib.webdemo.vo.UserBuilderVO$UserBuilderVOBuilder
----
prtClasses: length=0
----
prtConstructors: length=1
构造方法名称:com.lib.webdemo.vo.UserBuilderVO$UserBuilderVOBuilder, 参数数量:0, modifiers=0
----
prtFields: length=4
字段:id, type=class java.lang.Integer, modifiers=2
字段:name, type=class java.lang.String, modifiers=2
字段:tags, type=interface java.util.List, modifiers=2
字段:createTime, type=class java.util.Date, modifiers=2
----
prtMethods: length=6
方法名称:name, 参数数量:1, modifiers=1
方法名称:toString, 参数数量:0, modifiers=1
方法名称:id, 参数数量:1, modifiers=1
方法名称:createTime, 参数数量:1, modifiers=1
方法名称:build, 参数数量:0, modifiers=1
方法名称:tags, 参数数量:1, modifiers=1

存在6个方法,其中一个为 build,用来生成 最终的 UserBuilderVO 对象。

 

链式编程 创建对象:

private static void testCreateUserBuilderVO() {
cs.accept("\n\n测试:testCreateUserBuilderVO...");
UserBuilderVO bvo = UserBuilderVO.builder()
.id(1)
.name("ben")
.tags(new ArrayList<>())
.createTime(new Date())
.build();
cs.accept("UserBuilderVO bvo=" + bvo);
}

测试结果:

测试:testCreateUserBuilderVO...
UserBuilderVO bvo=com.lib.webdemo.vo.UserBuilderVO@87aac27

 

直接输出对象,看不到对象里面各个属性的值;

也没有各个属性的getter方法,无法获取内部属性的值。

 

存在缺点:

无法用 链式编程 设置对象中 列表的值;(第3节)

对于 createTime,是否可以设置默认值?(第4节)

 


2、@Builder+@ToString+@Getter

给上面的 UserBuilderVO 类添加 @ToString、@Getter 注解。

 

类分析结果:多了 getter方法 和 ToString方法

prtMethods: length=6
方法名称:toString, 参数数量:0, modifiers=1
方法名称:getName, 参数数量:0, modifiers=1
方法名称:getId, 参数数量:0, modifiers=1
方法名称:builder, 参数数量:0, modifiers=9
方法名称:getCreateTime, 参数数量:0, modifiers=1
方法名称:getTags, 参数数量:0, modifiers=1

 

创建对象后输出结果:可以看到对象内部各个属性的值了

测试:testCreateUserBuilderVO...
UserBuilderVO bvo=UserBuilderVO(id=1, name=ben, tags=[], createTime=Mon Dec 05 19:23:44 CST 2022)

 


3、填充列表的值(@Singular)

在 第1节中,对 UserBuilderVOBuilder 类进行了分析,存在一个 tags方法。

此时,在链式编程中,需要提前建立一个列表作为参数传入。

要想在链式编程中设置tags属性的值,需要使用 @Singular 注解。

 

注,Singular adj.  <语>单数的; <正>突出的; 奇特的; 非凡的; n.  单数形式(的词)。ben发布于博客园

 

(在第2节的基础上)给 UserBuilderVO 的 tags 属性添加 @Singular 注解。

UserBuilderVO 的类分析结果不变。

但 UserBuilderVOBuilder 的类分析结果(2) 存在下面的变化:

测试:class=class com.lib.webdemo.vo.UserBuilderVO$UserBuilderVOBuilder
----
prtClasses: length=0
----
prtConstructors: length=1
构造方法名称:com.lib.webdemo.vo.UserBuilderVO$UserBuilderVOBuilder, 参数数量:0, modifiers=0
----
prtFields: length=4
字段:id, type=class java.lang.Integer, modifiers=2
字段:name, type=class java.lang.String, modifiers=2
字段:tags, type=class java.util.ArrayList, modifiers=2
字段:createTime, type=class java.util.Date, modifiers=2
----
prtMethods: length=8
方法名称:name, 参数数量:1, modifiers=1
方法名称:toString, 参数数量:0, modifiers=1
方法名称:id, 参数数量:1, modifiers=1
方法名称:createTime, 参数数量:1, modifiers=1
方法名称:build, 参数数量:0, modifiers=1
方法名称:tags, 参数数量:1, modifiers=1
方法名称:tag, 参数数量:1, modifiers=1
方法名称:clearTags, 参数数量:0, modifiers=1

多了 tag、clearTags 两个方法。

 

新的创建对象:链式编程 填充列表属性的值

private static void testCreateUserBuilderVO() {
cs.accept("\n\n测试:testCreateUserBuilderVO...");
UserBuilderVO bvo = UserBuilderVO.builder()
.id(1)
.name("ben")
// 旧 tags 方法
// .tags(new ArrayList<>())
// 新 tag方法
.tag("1").tag("2").tag("AAAA")
.createTime(new Date())
.build();
cs.accept("UserBuilderVO bvo=" + bvo);
}

测试结果:

测试:testCreateUserBuilderVO...
UserBuilderVO bvo=UserBuilderVO(id=1, name=ben, tags=[1, 2, AAAA], createTime=Mon Dec 05 19:43:06 CST 2022)

tags现在有值了。

 


填充Map

添加字段scores:

类分析结果:

测试:class=class com.lib.webdemo.vo.UserBuilderVO
----
prtClasses: length=1
内部类: com.lib.webdemo.vo.UserBuilderVO.UserBuilderVOBuilder, com.lib.webdemo.vo.UserBuilderVO$UserBuilderVOBuilder, UserBuilderVOBuilder, com.lib.webdemo.vo.UserBuilderVO$UserBuilderVOBuilder, modifiers=9
----
prtConstructors: length=1
构造方法名称:com.lib.webdemo.vo.UserBuilderVO, 参数数量:5, modifiers=0
----
prtFields: length=5
字段:id, type=class java.lang.Integer, modifiers=2
字段:name, type=class java.lang.String, modifiers=2
字段:tags, type=interface java.util.List, modifiers=2
字段:scores, type=interface java.util.Map, modifiers=2
字段:createTime, type=class java.util.Date, modifiers=2
----
prtMethods: length=13
方法名称:toString, 参数数量:0, modifiers=1
方法名称:getName, 参数数量:0, modifiers=1
方法名称:getId, 参数数量:0, modifiers=1
方法名称:builder, 参数数量:0, modifiers=9
方法名称:access$1, 参数数量:0, modifiers=4104
方法名称:access$2, 参数数量:0, modifiers=4104
方法名称:getTags, 参数数量:0, modifiers=1
方法名称:getCreateTime, 参数数量:0, modifiers=1
方法名称:getScores, 参数数量:0, modifiers=1
方法名称:$default$name, 参数数量:0, modifiers=10
方法名称:access$0, 参数数量:0, modifiers=4104
方法名称:$default$id, 参数数量:0, modifiers=10
方法名称:$default$createTime, 参数数量:0, modifiers=10
测试:class=class com.lib.webdemo.vo.UserBuilderVO$UserBuilderVOBuilder
----
prtClasses: length=0
----
prtConstructors: length=1
构造方法名称:com.lib.webdemo.vo.UserBuilderVO$UserBuilderVOBuilder, 参数数量:0, modifiers=0
----
prtFields: length=9
字段:id$value, type=class java.lang.Integer, modifiers=2
字段:id$set, type=boolean, modifiers=2
字段:name$value, type=class java.lang.String, modifiers=2
字段:name$set, type=boolean, modifiers=2
字段:tags, type=class java.util.ArrayList, modifiers=2
字段:scores$key, type=class java.util.ArrayList, modifiers=2
字段:scores$value, type=class java.util.ArrayList, modifiers=2
字段:createTime$value, type=class java.util.Date, modifiers=2
字段:createTime$set, type=boolean, modifiers=2
----
prtMethods: length=11
方法名称:name, 参数数量:1, modifiers=1
方法名称:toString, 参数数量:0, modifiers=1
方法名称:id, 参数数量:1, modifiers=1
方法名称:tag, 参数数量:1, modifiers=1
方法名称:score, 参数数量:2, modifiers=1
方法名称:createTime, 参数数量:1, modifiers=1
方法名称:build, 参数数量:0, modifiers=1
方法名称:clearTags, 参数数量:0, modifiers=1
方法名称:clearScores, 参数数量:0, modifiers=1
方法名称:tags, 参数数量:1, modifiers=1
方法名称:scores, 参数数量:1, modifiers=1

 

测试代码及结果:

测试:testCreateUserBuilderVO...
UserBuilderVO bvo=UserBuilderVO(id=1, name=ben, tags=[1, 2, AAAA],
scores={数学=100, 语文=99, 科学=98, 文明=97}, createTime=Mon Dec 05 19:55:43 CST 2022)

 


4、设置默认值(@Builder.Default)

UserBuilderVO 对象的属性默认是null,可以使用 @Builder.Default 设置各个属性的默认值。ben发布于博客园

更新后的 UserBuilderVO:

@Builder
@Getter
@ToString
public class UserBuilderVO {
@Builder.Default
private Integer id = 2;

@Builder.Default
private String name = "罗峰";

@Singular
private List tags;

@Builder.Default
private Date createTime = new Date();

}

 

类分析:

测试:class=class com.lib.webdemo.vo.UserBuilderVO
----
prtClasses: length=1
内部类: com.lib.webdemo.vo.UserBuilderVO.UserBuilderVOBuilder, com.lib.webdemo.vo.UserBuilderVO$UserBuilderVOBuilder, UserBuilderVOBuilder, com.lib.webdemo.vo.UserBuilderVO$UserBuilderVOBuilder, modifiers=9
----
prtConstructors: length=1
构造方法名称:com.lib.webdemo.vo.UserBuilderVO, 参数数量:4, modifiers=0
----
prtFields: length=4
字段:id, type=class java.lang.Integer, modifiers=2
字段:name, type=class java.lang.String, modifiers=2
字段:tags, type=interface java.util.List, modifiers=2
字段:createTime, type=class java.util.Date, modifiers=2
----
prtMethods: length=12
方法名称:toString, 参数数量:0, modifiers=1
方法名称:getName, 参数数量:0, modifiers=1
方法名称:getId, 参数数量:0, modifiers=1
方法名称:builder, 参数数量:0, modifiers=9
方法名称:$default$id, 参数数量:0, modifiers=10
方法名称:$default$name, 参数数量:0, modifiers=10
方法名称:access$1, 参数数量:0, modifiers=4104
方法名称:getTags, 参数数量:0, modifiers=1
方法名称:access$2, 参数数量:0, modifiers=4104
方法名称:access$0, 参数数量:0, modifiers=4104
方法名称:getCreateTime, 参数数量:0, modifiers=1
方法名称:$default$createTime, 参数数量:0, modifiers=10
测试:class=class com.lib.webdemo.vo.UserBuilderVO$UserBuilderVOBuilder
----
prtClasses: length=0
----
prtConstructors: length=1
构造方法名称:com.lib.webdemo.vo.UserBuilderVO$UserBuilderVOBuilder, 参数数量:0, modifiers=0
----
prtFields: length=7
字段:id$value, type=class java.lang.Integer, modifiers=2
字段:id$set, type=boolean, modifiers=2
字段:name$value, type=class java.lang.String, modifiers=2
字段:name$set, type=boolean, modifiers=2
字段:tags, type=class java.util.ArrayList, modifiers=2
字段:createTime$value, type=class java.util.Date, modifiers=2
字段:createTime$set, type=boolean, modifiers=2
----
prtMethods: length=8
方法名称:name, 参数数量:1, modifiers=1
方法名称:toString, 参数数量:0, modifiers=1
方法名称:id, 参数数量:1, modifiers=1
方法名称:build, 参数数量:0, modifiers=1
方法名称:tag, 参数数量:1, modifiers=1
方法名称:clearTags, 参数数量:0, modifiers=1
方法名称:createTime, 参数数量:1, modifiers=1
方法名称:tags, 参数数量:1, modifiers=1

UserBuilderVO 的变化:方法里面多了 $default$ + 属性名、access$0~2。

UserBuilderVOBuilder 的变化:属性多了 属性名 + $value、属性名 + $set 格式的属性,少了 属性名 的属性、ben发布于博客园

 

创建对象:

cs.accept("\n\n测试:testCreateUserBuilderVO...");
UserBuilderVO bvo = UserBuilderVO.builder()
.build();
cs.accept("UserBuilderVO bvo=" + bvo);

测试结果:

测试:testCreateUserBuilderVO...
UserBuilderVO bvo=UserBuilderVO(id=2, name=罗峰, tags=[], createTime=Mon Dec 05 19:56:21 CST 2022)

 

更多测试:

@Singular 和 @Builder.Default 不可以同时存在。ben发布于博客园

 

 

疑问:

@Data 是否有什么更进一步的用法呢?ben发布于博客园

 

@Builder 的更多使用方式,可以看 参考资料#1 —— 来自官方

 


参考资料

1、官方文档-@Builder

https://projectlombok.org/features/Builder

讲的很详细。基本用法、高级用法。ben发布于博客园

2、Lombok 中@Builder 的使用

https://www.cnblogs.com/minmin123/p/14368725.html

posted @ 2021-02-03 18:27  keepsummer

3、

 

ben发布于博客园

 



推荐阅读
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • springboot启动不了_Spring Boot + MyBatis 多模块搭建教程
    作者:枫本非凡来源:www.cnblogs.comorzlinp9717399.html一、前言1、创建父工程最近公司项目准备开始重构,框 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
author-avatar
蒋易之
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有