聊聊@Accessors和@Builder

news/2024/10/17 5:37:22/

目录

  • @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/1043676.html

相关文章

【LeetCode】581.最短无序连续子数组

题目 给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。 请你找出符合题意的 最短 子数组,并输出它的长度。 示例 1: 输入:nums [2,6…

管理类联考——逻辑——真题篇——按知识分类——汇总篇——二、论证逻辑——支持加强——第四节——分类4——比例支持

文章目录 第四节 支持加强-分类4-比例支持题-支持加强-分类4-比例支持(数据支持)-同比削弱,差比支持真题(2011-54)-支持加强-分类4-比例支持(数据支持)-同比削弱,差比支持第四节 支持加强-分类4-比例支持 题-支持加强-分类4-比例支持(数据支持)-同比削弱,差比支持…

ISBN号码(NOIP2008 普及组第一题)

ISBN号码 说明 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最后一位是识别码&#x…

跟着美团学设计模式(感处)

读了着篇文章之后发现真的是,你的思想,你的思维是真的比比你拥有什么技术要强的。 注 开闭原则 开闭原则(Open-Closed Principle)是面向对象设计中的基本原则之一,它的定义是:一个软件实体应该对扩展开放…

noip2017普及组初赛 快速幂 求x^p%m的值。

说明 求xp mod m x^p \bmod m xpmodm 的值。 输入格式 三个不超过 10000 的正整数 x&#xff0c;p&#xff0c;m。 输出格式 1个整数。 样例 输入数据 1 2 10 100 Copy 输出数据 1 24 Copy 提示 noip2017普及组初赛 #include<bits/stdc.h> using namespace std; long l…

Linux 黑话解析:什么是 LUKS 加密?

导读LUKS 是 Linux 用户中流行的磁盘加密机制。在这篇术语解析文章中&#xff0c;可以了解更多关于 LUKS 的信息。 计算机安全旨在保护私密信息。有许多方法可以保护系统。一些用户使用简单的用户名/密码登录方案进行基本保护。其他用户可能会通过加密以不同的方式增加额外的保…

工具推荐:Chat2DB一款开源免费的多数据库客户端工具

文章首发地址 Chat2DB是一款开源免费的多数据库客户端工具&#xff0c;适用于Windows和Mac操作系统&#xff0c;可在本地安装使用&#xff0c;也可以部署到服务器端并通过Web页面进行访问。 相较于传统的数据库客户端软件如Navicat、DBeaver&#xff0c;Chat2DB具备了与AIGC…

Rust语法:所有权引用生命周期

文章目录 所有权垃圾回收管理内存手动管理内存Rust的所有权所有权转移函数所有权传递 引用与借用可变与不可变引用 生命周期悬垂引用函数生命周期声明结构体的生命周期声明Rust生命周期的自行推断生命周期约束静态生命周期 所有权 垃圾回收管理内存 Python&#xff0c;Java这…