1. 程式人生 > >使用Lombok @Builder註解導致預設值無效

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