热门标签 | 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发布于博客园

 



推荐阅读
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 作为一名新手,您可能会在初次尝试使用Eclipse进行Struts开发时遇到一些挑战。本文将为您提供详细的指导和解决方案,帮助您克服常见的配置和操作难题。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 深入理解ExtJS:从入门到精通
    本文详细介绍了ExtJS的功能及其在大型企业前端开发中的应用。通过实例和详细的文件结构解析,帮助初学者快速掌握ExtJS的核心概念,并提供实用技巧和最佳实践。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍了如何使用Spring Boot进行高效开发,涵盖了配置、实例化容器以及核心注解的使用方法。 ... [详细]
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社区 版权所有