使用Lombok @Builder註解導致預設值無效
阿新 • • 發佈:2018-12-30
@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