使用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

猜你喜欢

转载自blog.csdn.net/huanghanqian/article/details/85382092