Lombok中@Builder存在默认值的坑
Lombok中@Builder存在默认值的坑
今日IT小知识分享:Lombok中@Builder存在默认值的坑的相关经验,下面小编为您详细解答
前段时间开发时候,在使用Lombok中@Builder注解发现的问题。
原因在给一个用@Builder注解的Java Bean的一个属性赋默认值之后,使用build方式构建出来的对象该属性的值是null
1.默认值存在问题
在本地创建Student类,给name属性赋上默认值张三。并写了一个测试用例,判断name是否是null。
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
public class Student {
private int age;
private String name="张三";
}
创建测试用例:
@Test
public void studentTest() {
Student student = Student.builder().build();
System.out.println("student = " + student);
}
输出结果:
student = Student(age=0, name=null)

测试用例可以跑过,但是Student的name并没有赋默认值
2.解决方案
2.1. 在默认值字段上添加 @Builder.default注解
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
public class Student {
private int age;
@Builder.Default
private String name="张三";
}
输出结果:
student = Student(age=0, name=张三)

它简单易读,但有一些缺陷
思考:如果十多个字段存在默认值,那么这样是不是很麻烦?
注意:使用上述方案后,在lombok官方1.18.4版本之前new 出来的对象中没有默认值
2.2. 使用 toBuilder
@Builder 还支持从原始类的实例生成生成器的实例。默认情况下,此功能未启用。我们可以通过在构建器注解中设置 toBuilder 参数来启用它:
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
@Data
public class Student {
private int age;
// @Builder.Default
private String name="张三";
}
有了这个,就不需要在每个默认值字段上添加@Builder.Default注解。但是我们必须实例化类才能创建一个构建器。因此,我们还必须修改我们的测试
@Test
public void studentTest2() {
//使用new Student()对象
Student student = new Student().toBuilder().build();
System.out.println("student = " + student);
Student student1 = new Student();
System.out.println("student1 = " + student1);
}
输出结果:
student = Student(age=0, name=张三)
student1 = Student(age=0, name=张三)
相关阅读
-
服务器网站搭建教程 自己搭建小型服务器的方法
今天介绍服务器网站搭建教程和自己搭建小型服务器的方法的介绍,下面为详细的介绍。 一、搭建IIS服务器 1.启用功能 单击桌面左下角“开始”菜单,输入“控制面板”,双击进入“控制面板
-
网站建设与维护是干什么的 建设网站的基本流程
本文为你详解网站建设与维护是干什么的和建设网站的基本流程方面的介绍,一定能解决您的问题的,一起来了解吧! 网站维护是一个网站后期的工作主要内容和核心部分。 1、服务器软件维
-
开公司需要建网站吗 公司建立网站的步骤
一篇IT技术小知识,为您介绍开公司需要建网站吗和公司建立网站的步骤的电脑方面的小经验,很不错的方法小知识,建议收藏哦! 如今互联网时代的迅速发展,不论是创业还是传统线下的公
-
什么是SFlow和NetFlow
这些知识你了解吗?什么是SFlow和NetFlow方面的知识,一起来了解了解吧。 SFlow 简介 SFlow是一种基于数据包采样的网络流量监控技术,通常由交换机和路由器支持。 SFlow最初被设计为一种跨平台


