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)
图片[1]-Lombok中@Builder存在默认值的坑-不念博客

测试用例可以跑过,但是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=张三)
图片[2]-Lombok中@Builder存在默认值的坑-不念博客

它简单易读,但有一些缺陷

思考:如果十多个字段存在默认值,那么这样是不是很麻烦?

注意:使用上述方案后,在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=张三)
图片[3]-Lombok中@Builder存在默认值的坑-不念博客

我们探讨Lombok 构建器提供默认值存在问题,以及两种解决方案,如何选择,须根据项目情况谨慎选择。

© 版权声明
THE END