lombok 插件使用注意事项

为了更简洁的构造bean对象,使用注解@Builder,然而发现,通过builder生成的bean对象,字段默认值没了(备注:日常开发中,bean 的成员变量尽量使用封装对象,以及尽量不要有默认值),但是通过new 得到的对象,字段默认值存在。

问题伪代码如下:

/**
 * @description: 用户父类
 * @author: lyl
 * @create: 2022-06-01 14:42:27
 **/
@Data
public class UserParent {
    /**
     * id
     */
    private String id;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserChildren extends UserParent{
    /**
     * 姓名
     */
    private String name = "七夜";

    /**
     * 年龄
     */
    private Integer age;
}

@SpringBootTest
class CodeTestApplicationTests {

	@Test
	void contextLoads() {
		UserChildren user1 = new UserChildren();
		System.out.println(user1);
		UserChildren user2 = UserChildren.builder().build();
		System.out.println(user2);
	}
}

执行结果如下:
UserChildren(name=七夜, age=null)
UserChildren(name=null, age=null)

针对lombok注解问题的排查,最简单的方式就是直接查看编译之后的代码。反编译后的UserCildren.class如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.yalin.code.vo;

public class UserChildren extends UserParent {
    private String name = "七夜";
    private Integer age;

    public static UserChildrenBuilder builder() {
        return new UserChildrenBuilder();
    }

    public String getName() {
        return this.name;
    }

    public Integer getAge() {
        return this.age;
    }

    public void setName(final String name) {
        this.name = name;
    }

    public void setAge(final Integer age) {
        this.age = age;
    }

    public boolean equals(final Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof UserChildren)) {
            return false;
        } else {
            UserChildren other = (UserChildren)o;
            if (!other.canEqual(this)) {
                return false;
            } else {
                Object this$age = this.getAge();
                Object other$age = other.getAge();
                if (this$age == null) {
                    if (other$age != null) {
                        return false;
                    }
                } else if (!this$age.equals(other$age)) {
                    return false;
                }

                Object this$name = this.getName();
                Object other$name = other.getName();
                if (this$name == null) {
                    if (other$name != null) {
                        return false;
                    }
                } else if (!this$name.equals(other$name)) {
                    return false;
                }

                return true;
            }
        }
    }

    protected boolean canEqual(final Object other) {
        return other instanceof UserChildren;
    }

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $age = this.getAge();
        result = result * 59 + ($age == null ? 43 : $age.hashCode());
        Object $name = this.getName();
        result = result * 59 + ($name == null ? 43 : $name.hashCode());
        return result;
    }

    public String toString() {
        String var10000 = this.getName();
        return "UserChildren(name=" + var10000 + ", age=" + this.getAge() + ")";
    }

    public UserChildren() {
    }

    public UserChildren(final String name, final Integer age) {
        this.name = name;
        this.age = age;
    }

    public static class UserChildrenBuilder {
        private String name;
        private Integer age;

        UserChildrenBuilder() {
        }

        public UserChildrenBuilder name(final String name) {
            this.name = name;
            return this;
        }

        public UserChildrenBuilder age(final Integer age) {
            this.age = age;
            return this;
        }

        public UserChildren build() {
            return new UserChildren(this.name, this.age);
        }

        public String toString() {
            return "UserChildren.UserChildrenBuilder(name=" + this.name + ", age=" + this.age + ")";
        }
    }
}

通过查看编译之后的代码,可以看到,使用@Builder注解之后,lombok会生成一个UserChildrenBuilder的静态内部类,这个类包含了UserChildren的成员变量,但是包含的成员变量中,name字段的初始值没了,当我们使用UserChildren.builder().build()来构造bean时,代码内部先生成一个UserChildrenBuilder的对象,然后对这个对象进行赋值,最后调用UserChildren的全参构造函数,生成UserChildren对象。就像一个代理一样!

因此:

使用new 对象时,没有使用到UserChildrenBuilder,因此name字段的初始值保留了。

使用builder构造对象时,UserChildrenBuilder的name字段没有了初始值,生成的对象,name字段自然就没值了。

本文链接:https://www.dzdvip.com/33843.html 版权声明:本文内容均来源于互联网。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 395045033@qq.com,一经查实,本站将立刻删除。
(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年6月11日 10:52
下一篇 2022年6月11日 13:11

相关推荐

  • 360推广霸屏技术能够优化关键词的排名效果

    什么叫软文推广?就是用软文的形式来推广,用大众非常能接受的方式来推广,可以一篇日志,也可以是新闻,还可以是几句话简短通俗的帖子,总之,只要是能在字里行间不知不觉的渗透产品信息,并且利用该文字来做推广的就叫做软文推广。 其实在目前所有的网站都是可以发新闻的。因为一个网站想要具有流量,就是需要依靠内容来吸引网友的。而这里所说的内容自然就是指新闻了。但是需要指出的是,网站平时所发布的新闻和进行营销推广时候所发布的新闻软文是非常不同的。因此,这里所说的什么网站可以发新闻,其实主要说的是发软文。这就比较麻烦了。虽然说一些网站不会接受软文,但是在当前的网站上面,大部分还是拥有软文的存在的。这当然是因为在硬广逐渐开始不受重视的情况下,软文也是很多网站的盈利模式之一。而这也注定了软文价格比较高。 信息霸屏 其实,做到合适的软文给合适的人看是需要注意的,也是很重要的。我做的是一个返利网站,我认为我的目标人群主要有三类,一是消费群体,对于这类人群,我一般会写一些用户体验的分享软文来刺激他们的购买欲望,发布到一些论坛或是个人站群上,促进成交量。第二类是一些寻求合作的网店店主,我会写返利网的赢利模式,加入的好处以及未来的发展前景等行业相关性高的新闻软文来推广,然后登陆云爪直通车将写好的文章发到新浪或是网易上,增加稿件的权威性和可信度。第三类人群是一些和我同样有梦想的建站人,或者叫站长,针对他们我多会写一些建站的经验或是推广方面的知识以及推荐一些好的软文营销网之类的,和他们建立联系,增加流量。 除了新闻推广的操作方式,发布平台的选择对软文营销的效果起着同样决定性的作用。一般来说,企业都喜欢讲自己的新闻发布到一些知名的媒体上,来增加新闻的浏览量。不过需要注意的是,并不是只要将软新闻发布到媒体网站上就会引来高的流量,还要根据企业的宣传对象、产品特点以及新闻投放的目的来具体的选择板块和栏目,这样才能确保有很多的人群来关注,达到新闻推广的目的。

    2021年5月30日
    13
  • 头戴式耳机选购指南

    相比入耳式和耳挂式的耳机而言,头戴式耳机的选购难度相对最高,因为有很多外在因素都会影响实际听感。 对于发烧友来说选择头戴式耳机的准则那就是三个字:轻,奢,舒! 轻就是耳机重量不宜太重,要方便携带且久戴不觉得压头。 奢就是在预算范围内尽量选择有足够逼格的耳机。 舒就是耳机佩戴上舒适感非常重要。 一、选购头戴式耳机注意事项1.无线传输规格 SBC是最早的音频编码格式,比特率较低压缩率高,音质较差。 ACC是一种高压缩比的编码算法,听感好于SBC。 APTX是CSR公司的专利编码算法,拥有更低的延迟和传输码率。 LDAC是索尼推出的全新无线音频编码技术,目前蓝牙编码中音质最佳的编码。 2.佩戴舒适度 舒适度是众友们非常看重的一点,特别是头戴式的耳机。必须考虑到耳垫以及头垫材质的亲肤性和柔软度。没有压迫感的机型,可以让我们长时间佩戴耳机却感觉不到负担,如果机型和自己的头型契合度高,耳机可以完全贴合自己的耳朵,还可以减少漏音的问题以获得更饱满的中低频效果。 其次重量也是不可忽视的,挑选既能兼顾性能又轻量化的产品,找到和自己最契合的佩戴感。 3.降噪能力 被动降噪其实就是用个东西堵住你的耳朵,用物理法隔音。 主动降噪还有个别名叫拾音降噪耳机,拾音就是通过麦克风来监测外界的噪音,然后通过发出声音相抵消检测到的噪音来实现降噪的目的。 在合适的噪声种类下主动降噪才能发挥出他的最大效用。但是如果是在环境安静的情况下,打开主动降噪相当于是在劣化耳机的音质。所以如果你的使用环境趋于稳定安静的话,大可以少在降噪方面投入无谓的金钱,没必要花钱在一个用不太到的功能上。 二,头戴式耳机选购需求导向1.用途 如果喜欢自己一个人在家嗨的,可以考虑开放式包耳大头戴,如果是要带出街的那选择半开放或封闭式的压耳式的会更适合你。 2.前端:使用什么设备推耳机。 简单的说,前端推力基本指的是能提供多大的电流输出。 耳机方面,有两个相关参数,一个是阻抗,一个是灵敏度。阻抗越低,灵敏度越高,越好推。 灵敏度就是说像类似于手机和集成声卡的设备推力不足,如果耳机功率过大就会因为推力不足而导致无法发挥耳机的实力。 3.耳机的重要参数 声场:大声场就像在电影院看电影,小声场就像在房间里看电视,你能感受到的空间大小取决于声场大小。 三频:耳机三频指的是低频、中频、高频,三频均衡指高中低频量感合适,衔接良好,不会出现某个频断掩…

    2021年7月11日
    19
  • 如何把自媒体平台文章同步到WordPress网站?

    自媒体文章一旦过了推荐期就不能持续为作者带来收益了,为了解决这一问题,可以自建网站(博客)来同步更新文章,通过经营网站来实现持续的盈利。 当你搭建起网站后,会发现前期在各大自媒体平台发布的几十篇甚至几百篇文章要同步到网站是一个浩大的工程。如9SiR在今日头条发布文章有二十多篇,如果靠纯手工搬运,至少需要半天的时间。 下面9SiR把今日头条文章同步到WordPress网站的方法跟大家分享一下。 使用工具: 抓包工具Fiddler 火车头采集器 WordPress免登陆发布模块 Unicode编码转换工具 通过Fiddler抓包获取头条个人主页真实地址。先在浏览器中打开自己在今日头条个人主页,然后打开Fiddler,点击菜单栏“文件”-勾选“捕获通信”(或按快捷键F12)开始抓包,回到浏览器刷新头条主页,刷新完成后回到Fiddler按下F12停止抓包。 把真实地址复制到浏览器打开,密密麻麻的加密的代码,通过在线“Unicode编码转换”工具,将加密代码解密。 找到第一篇文章的数据代码片段,其中包含第一篇文章的真实地址: “source_url”: “/item/6411865347309175297/” 启动火车头采集器新建采集任务,点击起始网址右侧“添加”,填入主页真实地址,地址中“count=20”代表获取前20篇文章,如果文章较多的话,将数字改成相应文章数量即可,然后依次点击“添加”和“完成”。 在“多级网址获取”文本框右侧点击添加,在弹出的对话框中,选择“手动填写链接规则”。 网址获取区域开始代码:”data” 网址获取区域结束代码:”is_self” 脚本规则:”source_url”: “[参数]” 实际链接:http://今天头条网址/[参数1] 然后点击“保存”,至此网址采集规则填写完毕。 填写内容页采集规则。 在浏览器打开一篇文章,右键选择“查看源代码”。火车头采集器切换到“采集内容”选项卡,根据源代码填写标题、正文、等规则。 需要注意的是填写“内容”采集规则时,需要勾选“下载图片选项”并设置好图片保存的文件夹路径和文件名。 填写发布规则,这步需要事先下载“WordPress免登陆发布模块”并放入火车头采集器目…

    2021年6月16日
    55
  • 车上的LOCK是什么意思(汽车点火锁开关档位说明什么)

    LOCK挡指的是锁止挡,也是钥匙插入和拔出的位置。 汽车点火锁芯有几个档,分别是什么意思? 汽车的点火锁芯也有好几个档位,很多人只知道两个档位,打火和熄火,并不知道其他是做什么用的,虽然部件简单,但使用频率很高,其实它一共是有四个档位的。 1.LOCK:锁止档,停车熄火时需打到该档位,只有在该档位钥匙才能拔出。如果此时转动方向盘,方向盘也会被锁止,下次再打火时,需一边转动方向盘,一边扭动钥匙,不然钥匙是转不动的。 2.ACC:附件档。接通后只有少量部件是有电的,比如收音机、点烟器。 3.ON:全车通电档。接通后车辆上所有部件全部通电,正常行驶时就是在该档位。 4.START:启动档,只有打火的那几秒钟要停留在该档位,当打着火后松开钥匙,会自动弹回到ON档。 打火时有什么要注意的呢? 先把点火开关打到ON的位置,此时全车通电,所有电子设备开始自检,油泵工作开始建立油压,待油压建立完成,大约2秒钟时间,然后旋转到启动档开始打火。也就是在ON的位置停留2秒钟,目的是等待油泵建立完足够的油压,顺利打火。 如果车辆有故障或积碳等原因,导致车辆启动困难,那么每次启动时间不要超过5秒钟,一次没有启动着,可以等10秒钟,再进行第二次启动。因为启动过程电流是很大的,长时间启动容易引起线路过热,烧坏线路,对电瓶和启动机寿命也有一定影响。如果三次以上还没有启动着,可以一边启动,一边反复松踩油门,对有积碳的老车很有用。如果还启动不着,就叫救援拖车吧。

    2022年8月6日
    83
  • 2022全球开发者薪资曝光:中国排第19名,平均年薪23,790美元

    近日,技术人才智能招聘平台CodeSubmit发布了一份软件工程行业的薪资报告,他们通过查找对比美国、欧盟、印度等20多个国家开发人员的数据,得出了这些国家软件工程行业的平均工资。以下是具体内容(节选部分): 美国开发人员平均年薪超11万美元,全球最高 报告显示,美国软件工程师的工资最高,其次是瑞士和以色列。工资排名前十的名单如下: 此外,其他工资较高的国家还有爱尔兰、芬兰、荷兰等。中国则排在第19位,平均年薪为23,790美元。 其中,尼日利亚以7,255美元的年薪垫底。印度作为西方公司倾向于将其技术需求外包的国家,其平均年薪为7,725美元,排在倒数第二。 CodeSubmit指出,软件开发总体而言是世界上最受欢迎的职业,对软件开发人员需求最高的国家是加拿大、澳大利亚、俄罗斯、瑞典和新西兰。由于开发人才紧缺,它们的工资水平也往往更高。 初、高级开发者工资水平差距大,职称也影响薪资 美国软件开发人员的平均工资为110,140美元/年或9,178美元/月。初级开发人员的平均工资为69,354美元/年或5,779美元/月,高级开发人员的平均工资为104,188美元/年或8,682美元/月。软件开发人员收入最高的州是加利福尼亚,平均工资为146,770美元;华盛顿以145,150美元排名第二;马里兰以131,240美元排名第三。在美国编程语言的平均工资水平中,Go和Python等流行的后端语言位居榜首。具体表现为: Go是收入最高的语言,平均工资为120,577美元 Ruby以119,558美元位居第二 Python为114,904美元 Java的平均工资为112,013美元 JavaScript为111,922美元 Android开发者的平均收入为109,377美元 与Android相比,iOS的平均工资略低,为108,783美元 Rust紧随其后,为108,744美元 C语言为101,734美元 PHP为92,867美元 SQL最少,为85,845美元 除了使用的编程语言外,职位名称也可以对技术人才产生重大影响。比如软件开发人员的平均工资为110,140美元,而程序员的平均工资为105,310美元。其中: 软件开发人员、软件质量保证分析师和测试人员的平均工资为110,140美元 软件和网络开发人员、程序员和测试人员紧随其后,为105,310美元 计算机类职业的工资为…

    2022年7月12日
    18
  • 爱站关键词挖掘怎么用(爱站网关键词挖掘查询工具)

    用过这个工具的朋友都知道,这个工具是爱站出的,完全免费,可以查询到无限多的关键词,支持百度指数批量查询和关键词挖掘功能,可批量快速查询并导出指定级别指数的关键词.关键词挖掘可挖出爱站开站以来所有数据,支持联想/过滤等功能/筛选/导出等功能。 在建站初期或者新产品上线初期,做seo的朋友总免不了要进行关键词研究。面对一个完全陌生或者不甚了解,也或者有所了解的产品(或服务或者其它),该如何去挖掘到有用户搜索量的关键词呢?光靠自己头脑中的知识当然难以达成任务,这个必须要借助专业的关键词挖掘工具了。爱站网的百度关键词挖掘工具就是这样的一个优秀的seo辅助工具。下面就介绍下这个工具。 工具地址:http://ci.aizhan.com/seo/ 如图,界面简洁明了。输入你的目标关键词,点击查询,即可查到所有有指数的包含了你的目录关键词的所有关键词。默认每页显示一百条,多出的可翻页。 搜索量,即该词的百度指数。省去你找到关键词后还要打开index.baidu.com去查询百度指数的麻烦。 收录数。即在百度搜索该关键词,百度结果的数量。可以一定程度上反应出该词的竞争情况。 首页第一位。即搜索该关键词,排名第一位的站点。这里显示该站点的域名及网页标题。在此可对其做一个简单了解,点击可进入到该站。 首页第二位。同上。 优化难度。根据以上指标综合计算的一个参考值。通过它可大概判断出该关键词的优化难度。为您确定关键词策略提供依据。

    2022年1月12日
    93