前段时间开发时候,在使用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=张三)
我们探讨Lombok 构建器提供默认值存在问题,以及两种解决方案,如何选择,须根据项目情况谨慎选择。
© 版权声明
本站文章由不念博客原创,未经允许严禁转载!
THE END