使用Lombok @Builder注解导致默认值无效

Posted 凉茶方便面

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Lombok @Builder注解导致默认值无效相关的知识,希望对你有一定的参考价值。

@Builder注解导致默认值无效

使用Lombok注解可以极高的简化代码量,比较好用的注解除了@Data之外,还有@Builder这个注解,它可以让你很方便的使用builder模式构建对象,但是今天发现@Builder注解会把对象的默认值清掉。

像下面这段代码,会导致对象的name属性变为null:

public class BuilderTest 
    @lombok.Builder
    @lombok.Data
    private static class Builder 
        private String name = "1232";
    

    @Test
    public void test() 
        Builder builder = Builder.builder().build();
        System.out.println(builder.getName());
    

---打印结果---
null

那么不想让这个默认值被清除,就只能用另外一个注解来对属性进行设置:@lombok.Builder.Default
示例代码如下:

public class BuilderTest 
    @lombok.Builder
    @lombok.Data
    private static class Builder 
        @lombok.Builder.Default
        private String name = "1232";
    

    @Test
    public void test() 
        Builder builder = Builder.builder().build();
        System.out.println(builder.getName());
    

---打印结果---
1232
  • 需要注意的是@lombok.Builder.Default这个注解是后来才有的,目前已知的是1.2.X没有,1.6.X中有这个注解。

原因分析

使用@Builder注解的代码如下:

@lombok.Builder
class Example 
    private String name = "123";

Lombok会生成如下代码:

class Example 
    private String name;

    private Example(String name) 
        this.name = name;
    

    public static ExampleBuilder builder() 
        return new ExampleBuilder();
    

    public static class ExampleBuilder 
        private String name;

        private ExampleBuilder() 

        public ExampleBuilder name(String name) 
            this.name = name;
            return this;
        

        @java.lang.Override public String toString() 
            return "Example(name = " + name + ")";
        

        public Example build() 
            return new Example(name);
        
    

很显然,ExampleBuilder的name没有默认值,导致build之后的Example的name是Null值。

以上是关于使用Lombok @Builder注解导致默认值无效的主要内容,如果未能解决你的问题,请参考以下文章

lombok中的@Builder.Default注解

Lombok中的@Builder注解的使用

lombok @Builder注解

@Builder lombok注解

学习笔记lombok的@Builder注解

lombok @Builder 注解的用法