使用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.Builderclass 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值。

lombok@Builder忽略属性默认值的坑点

1. 简单使用

他这个@Builder注解,相比之前的编辑器自动生成的getter setter的优点在哪呢?

看下面的使用例子

package com.lxk.lombok; import com.lxk.model.Bird; import java.util.Date; /** * 测试@Builder * * @author LiXuekai on 2019/5/13 */public class BuilderTest {    public static void main(String[] args) {        Bird bird = new Bird("12", "34", new Date(), "红色皮肤", "巨大无比", 18, "典韦", "不序列化的字段,是不会被转json输出的");        Bird build = Bird.builder().dog1("12").dog2("34").birthday(new Date())                .color("红色皮肤").size("巨大无比").age(18)                .name("典韦").deserialize("不序列化的字段,是不会被转json输出的").build();        System.out.println(build.toString());        System.out.println(bird.toString());    }}

运行结果:

使用Lombok @Builder注解导致默认值无效怎么解决

它相比编辑器生成的getter setter的优点:

1,代码很清晰,可读。可以很明确的知道,你的每一个属性的设置,

2,还有就是链式表达式,一串的就给set属性了,不需要写n行代码,之前自动生成的getter和setter,都需要写一个对象,然后再一个个的去点每一个属性的设置方法,

我例子里面的那个全参数构造方法,乍一看,看不出来每个参数是啥意思,但是下面的builder就很清楚的知道设置的都是啥。

代码使用的model bean的代码

package com.lxk.model; import com.alibaba.fastjson.annotation.JSONField;import lombok.AllArgsConstructor;import lombok.Builder;import lombok.Data;import lombok.NoArgsConstructor; import java.io.Serializable;import java.util.Date; /** * 鸟 * * @author LiXuekai on 2018/10/25 */@Data@NoArgsConstructor@AllArgsConstructor@Builderpublic class Bird implements Serializable {        private static final long serialVersionUID = 1L;     @JSONField(ordinal = 6, name = "内容是json字符串的属性", jsonDirect = true)    private String dog1;     @JSONField(ordinal = 5, name = "内容是json字符串的属性,对比下差异")    private String dog2;     /**     * ordinal,默认值为0,不用设置啦。     */    @JSONField(ordinal = 4, name = "生产日期", format = "yyyy年MM月dd日 HH时mm分ss秒")    private Date birthday;     @JSONField(ordinal = 3, name = "颜色")    private String color;     @JSONField(ordinal = 2, name = "体型大小")    private String size;     @JSONField(ordinal = 1, name = "年龄")    private int age;    /**     * 反序列化false,那么在反序列化的时候,就不会把json的值转给对象的这个属性。     */    @JSONField(name = "名称", deserialize = false)    private String name;    /**     * 不序列化此属性字段,那么在转json的时候,就不会在json中出现     */    @JSONField(ordinal = 7, name = "不序列化的属性字段", serialize = false)    private String deserialize;  }

2. 默认值问题

注意:默认值的情况。

如果原来的model bean 的属性是设置有默认值的,比如下面的age属性

使用Lombok @Builder注解导致默认值无效怎么解决

然后,运行结果

使用Lombok @Builder注解导致默认值无效怎么解决

@Builder默认是不支持默认值设置,或者说,自动忽略了model里面设置的默认值。

怎么让他支持默认值的设置。

使用Lombok @Builder注解导致默认值无效怎么解决

在有默认值的属性上使用这个注解:@Builder.Default

要是你的这个default不存在,那是因为你使用的这个Lombok的版本太低了,试着升级到1.18.4及以上。我使用的是1.18.8版本。

使用Lombok @Builder注解导致默认值无效怎么解决

3. 修改属性值

使用Lombok @Builder注解导致默认值无效怎么解决

在model上加上这个注解参数:@Builder(toBuilder = true)

然后使用的时候,使用toBuilder()方法拿到builder

使用Lombok @Builder注解导致默认值无效怎么解决

这个给人的感觉,类似String的replace()方法,他不是直接修改原来的对象,而是将结果以新的对象返回,所以,我们这儿需要个对象接收修改之后的返回值。

上面的执行结果,也可以看出来,修改过之后,原来的对象的值并没有变化,但是新接收的这个对象是修改后的值

关于“使用Lombok @Builder注解导致默认值无效怎么解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

文章标题:使用Lombok @Builder注解导致默认值无效怎么解决,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/21311

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年8月29日 下午11:55
下一篇 2022年8月29日 下午11:56

相关推荐

  • excel下拉列表怎么填充颜色

    excel下拉列表填充颜色的方法: 1、首先打开软件,然后点击“数据有效性”选择“数据有校性”。 2、之后在允许中选择“序列”并输入下拉值,在依次选择“条件格式—>等于”。 3、在设置格式的值中输入对应的值,选择右侧的下拉,点击“自定义格式”。 4、之后在字体任务选择栏右下方选择颜色。 5、最…

    2022年8月27日
    4.8K00
  • C语言内存分配函数被污染的示例分析

    1、被污染的内存分配 C 语言的内存分配函数包括 malloc()、 kmalloc 、 smalloc()、 xmalloc()、realloc()、 calloc()、 GlobalAlloc()、 HeapAlloc()等等,以 malloc()为例, malloc() 函数的原型为: ext…

    2022年9月20日
    61100
  • windows会声会影x5怎么注册

    会声会影x5注册教程 1、首先我们下载安装会声会影x5。 2、安装完成之后打开。 3、点击“继续”。 4、勾选名列前茅个选项,然后点击“继续”。 5、然后输入购买时的用户名密码就可以了。 6、如果我们目前没有购买,想先试用一下,可以勾选下面的“稍后注册”就可以先行使用体验了。 7、在下次打开时,我们…

    2022年9月15日
    46000
  • Web.config在渗透中的作用是什么

    前言  下面主要介绍web.config文件在渗透中的作用,即可上传一个web.config时的思路,话不多说,开始正题。首先我们来看一下web.config是什么,援引百度百科的介绍:  Web.config文件是一个XML文本文件,它用来储存ASP.NETWeb 应用程序的配置信息,它可以出现在…

    2022年9月24日
    73800
  • Redis+AOP怎么自定义注解实现限流

    今天分享文章“Redis+AOP怎么自定义注解实现限流”,主要从:下载、解压、准备编译、编译等几个方面为大家介绍,希望能帮到您。 下载 1,下载页面 2,下载 解压 tar -xzvf redis-5.0.7.tar.gz 准备编译 1, 请在操作前确认gcc是否已安装,gcc -v 如未安装,可以…

    2022年6月29日
    47400
  • 如何分析Win7蓝屏的解读和应对方案

    近期,深信服接到不少客户咨询关于Win7蓝屏大爆发的问题,大概内容指“Win7服役结束,微软不再更新补丁,电脑集体蓝屏,错误代码为F4,蓝屏与漏洞补丁有关联等等,并呼吁用户不要修复漏洞补丁”。 不过,从深信服收集上来的问题来看,并没有出现企业大规模Win7蓝屏的现象。我们通过追溯,发现比较早出现这一…

    2022年9月6日
    61500
  • windows证照之星如何换背景色

    证照之星换背景色的方法 1、 打开证照之星软件,添加图片之后点击选项栏的“背景处理”选项按钮。 2、点击选项后会跳出下图所示的界面内容。 3、背景处理中有涂抹功能和清除功能,分别是画出抠图范围和擦掉抠图范围。 4、完成达到自身要求的抠图后点击“处理”按钮, 然后可以为抠出来的图像选择证照之星软件自带…

    2022年9月26日
    77300
  • html5中使用哪个标签嵌入音频

    在html5中,可以使用audio标签嵌入音频;该标签的作用就是定义声音,比如音乐或者其他声音流,并且该标签仅支持MP3、Wav和Ogg三种声音格式,语法为“<audio src=”音频文件”>”。”。 本教程操作环境:windows10系统、html5版本、De…

    2022年9月15日
    71700
  • Java如何判断两个Long对象是否相等

    抛出问题: Long a = 4l;Long b = 4l;a == b //true Long a = 128l;Long b = 128l;a == b //false 如果Long的值在[-127,128]之间,用“==”判断是否相等是没问题的,如果不在这个区间,是不能用“==”的,原因如下源…

    2022年8月27日
    1.2K00
  • Python如何多线程并发下载图片

    最终效果 这就是我们最终要构建的效果。 安装依赖项 让我们安装每个人最喜欢的 requests 库。 pip install requests 现在,我们将看到一些用于下载单个 URL 并尝试自动查找图像名称以及如何使用重试的基本代码。 import requestsres = requests.g…

    2022年9月22日
    78800
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部