使用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值。
转载自:https://blog.csdn.net/teaandnoodle/article/details/80836125

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值