@Accessors和@Builder区别

news/2025/3/29 7:05:13/

目录

  • @Accessors和@Builder
    • @Accessors(chain=true)
    • @Builder
    • @Accessors和@Builder的区别
    • @Accessors和@Builder使用的坑
  • 详细看看@Accessors注解
    • @Accessors的源码
    • @Accessors属性说明
      • fluent属性
      • chain属性
      • makeFinal属性
      • prefix属性

@Accessors和@Builder

@Accessors(chain=true)

就是new一个对象后可以链式调用set给属性赋值

@Data
@Accessors(chain = true)
public class User {private String name;private Integer age;private Double weight;public static void main(String[] args) {User user = new User().setName("张三").setAge(18).setWeight(60.00);System.out.println(user);}
}

从上面的代码我们看到new User()后面可以链式调用set方法赋值

这是因为@Accessors(chain=true)将lombok生成的setter方法返回值变为了this,也就是返回了对象本身,代替了原本的void。

@Builder

@Builer注解是基于建造者模式的链式操作。

@Data
@Builder
public class User {private String name;private Integer age;private Double weight;public static void main(String[] args) {User user = User.builder().name("张三").age(18).weight(60.00).build();System.out.println(user);}
}

我们能看到是先使用bulder方法后再链式操作,然后调用build方法返回。

原因是内部生成了构建起UserBuilder,调用builder()方法就是是创建UserBuilder对象,然后给UserBuilder对象赋值,最后通过UserBuilder对象的build()来生成User对象。

可以看编译后的class文件

@Accessors和@Builder的区别

其实我们看它们编译后的class文件就可以直到原因。@Accessors是将生成的setter()方法返回this,而@Builder是再对象内部创建一个构建器,通过这个构建器来最终创建对象。

@Builder底层新建了一个对象,为了实现链式调用再创建一个对象感觉优点大材小用了。
@Accessors再实现了链式调用的基础上,减少了多余对象的创建。

@Accessors和@Builder使用的坑

  • 在有的开源反射工具包对对象进行浅拷贝时,获取set方法原信息时会判断返回值是否为void,这样使用@Accessors注解就会报错。
  • @Builder注解会给类默认生成全参构造,这样就没有了默认的无参构造,在Spring这类容器中默认调用无参构造就报错了,所以要加上@NoArgsConstructor@AllArgsConstructor注解

详细看看@Accessors注解

@Accessors的源码

在这里插入图片描述
可以看到它有四个属性,chian=true就是可以链式调用,其他的下面我们来分别说明下。

@Accessors属性说明

fluent属性

fluent=true时,setter和getter方法就没有set和get了,直接调用属性名即可

在这里插入图片描述

chain属性

chain=true时,就可以链式调用setter方法给属性赋值了

在这里插入图片描述

makeFinal属性

makeFinal=true时,生成的setter和getter方法都是final修饰的方法

在这里插入图片描述
final修饰的方法表示不能在子类中重写这些方法。

prefix属性

该属性添加一个数据,添加属性的前缀,表示忽略属性对应的前缀来生成setter和getter方法

在这里插入图片描述
如上图一样,属性赋值的时候就可以忽略前缀。

prefix属性的坑
1、如果属性的前缀和prefix写的前缀不匹配,那setter和getter方法就不会生成了。
2、属性的前缀后的第一个字母必须是大写,否则也不会生成setter和getter方法。
3、上面说的不会生成setter和getter方法是连不去前缀的都不会生成,相当于@Data注解失效了。


http://www.ppmy.cn/news/1048274.html

相关文章

嵌入式真的能做一辈子吗?

近些天有同学问我,现在互联网好多岗位都是吃青春饭,年纪大了就要被优化,嵌入式是不是也是这样呢?我告诉他完全不是,嵌入式是值得做一辈子的职业。 为什么我怎么有底气呢,因为嵌入式行业是一个非常广泛的领域…

对Lua的理解

在redis和nginx中都潜入了Lua环境用于快速上手开发。但如何理解Lua以及Lua与宿主环境的交互是需要掌握的。 首先是Lua本身,打开5.1的lua版本开始编译后最后生成一个lua的可执行文件,这其实就是一个包含了Lua虚拟机的终端.。所以其实在不管redis也好nginx…

【Redis从头学-6】Redis中的Hash数据类型实战场景之购物车

🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:Re…

ForkJoinPool 你真的明白和用对了吗

ForkJoinPool 是一个功能强大的 Java 类,用于处理计算密集型任务,使用 ForkJoinPool 分解计算密集型任务,并并行执行它们,能够产生更好的性能。它的工作原理是将任务分解成更小的子任务,使用分而治之的策略进行操作&am…

安防监控/视频集中存储/云存储平台EasyCVR v3.3增加首页告警类型

安防监控/视频集中存储/云存储EasyCVR视频汇聚平台,可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等…

正演的数值模拟(零基础,学习中)

摘要: 本贴从零开始学习正演的数值模拟方法. 1. 偏微分基础 1.1 导数 引例: 物体从一维坐标的原点开始移动, 在 t t t 时刻, 它在坐标轴的位置由函数 s ( t ) s(t) s(t) 确定, 则速度为位置变化量与时间的比值: v ( t ) d s ( t ) d t lim ⁡ Δ t → 0 s ( t Δ t ) …

APK 加固之后二次签名的问题

JKS 转为 KeyStore keytool -importkeystore -srckeystore targe.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore target.p12 keytool -v -importkeystore -srckeystore targe.p12 -srcstoretype PKCS12 -destkeystore targe.keystore -deststoretype JKS // 加固…

C# OpenCvSharp DNN 二维码增强 超分辨率

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.Dnn; using OpenCvSh…