这篇文章主要向大家介绍lombok @Builder踩坑系列 - 构造方法和默认值问题,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。
问题1:@Data和@Builder致使无参构造丢失
现象
- 单独使用@Data注解,是会生成无参数构造方法。
- 单独使用@Builder注解,发现生成了全属性的构造方法。
- @Data和@Builder一块儿用:咱们发现没有了默认的构造方法。若是手动添加无参数构造方法或者用@NoArgsConstructor注解都会报错!
两种解决方法
1. 构造方法加上@Tolerate 注解,让lombok伪装它不存在(不感知)
1 | less复制代码@Builder |
2. 直接加上这4个注解
1 | less复制代码@Data |
问题2:@Builder注解致使默认值无效
现象
使用Lombok注解能够极高的简化代码量,比较好用的注解除了@Data以外,还有@Builder这个注解,它可让你很方便的使用builder模式构建对象,可是今天发现@Builder注解会把对象的默认值清掉。java
1 | less复制代码@Data |
输出:TestLombok(aa=null)app
解决方案
只须要在字段上面加上@Builder.Default注解便可ui
1 | ini复制代码@Builder.Default |
缘由分析
咱们使用注解的方式,底层本质就是反射帮咱们生成了一系列的setter、getter,因此咱们直接打开编译后的target包下面的.class文件,上面的全部缘由一目了然!
源文件:this
1 | less复制代码@Data |
对应的class字节码:code
1 | kotlin复制代码// |
咱们想知道@Data、@Builder等注解底层到底作了什么,直接编译当前文件,便可在生成的.class字节码文件查看具体代码便知道了对象
好比上述第二点,采用@Builder的时候,这个aa并无默认值,因此会为空!!get
1 | kotlin复制代码 public TestLombok.TestLombokBuilder aa(String aa) { |
总结
我的以为若是想要使用@Builder,最简单的方法就是直接写上这4个注解,有默认值的话再加上@Builder.Default直接,正常状况下就没啥问题了!hash
1 | less复制代码@Data |
本文转载自: 掘金