@Accessors(chain = true)和@Builder链式风格差异

使用 @Accessors(chain = true)

java 复制代码
@Data
@Accessors(chain = true)
public class PageQuery {
    private Integer pageNo = 1;
    private Integer pageSize = 20;
    private Boolean isAsc = true;
    private String sortBy;
}

// 使用方式
PageQuery query = new PageQuery()
    .setPageNo(2)
    .setPageSize(10)
    .setIsAsc(false);

// 后续还可以修改(可变对象)
query.setSortBy("id");  // ✅ 可以继续修改

使用 @Builder

@Builder 生成的 Builder 类完全忽略字段的初始值,只使用类型默认值

如果要使用设置的默认值,需要加@Builder.Default

java 复制代码
@Data
@Builder
public class PageQuery {
    private Integer pageNo = 1;      // ⚠️ 默认值不生效!需要加 @Builder.Default
    private Integer pageSize = 20;
    private Boolean isAsc = true;
    private String sortBy;
}

// 使用方式
PageQuery query = PageQuery.builder()
    .pageNo(2)        // 注意:方法名是 pageNo(),不是 setPageNo()
    .pageSize(10)
    .isAsc(false)
    .build();         // 必须调用 build() 才创建对象

// 后续修改?可以,但违背 Builder 设计初衷
query.setSortBy("id");  // ⚠️ 可以修改,但破坏了不可变性

核心区别

特性 @Accessors(chain = true) @Builder
原理 修改 setter 返回值 生成独立的 Builder 内部类
对象创建 new + 链式 setter builder() 方法
是否可变 可变对象(可后续修改) Builder 构建后通常不可变
代码侵入 修改现有 setter 新增 Builder 类
性能 无额外对象开销 多创建一个 Builder 对象
默认值支持 字段默认值直接生效 需要 @Builder.Default
相关推荐
xrandzj32 分钟前
Python面向对象编程入门:类、实例、初始化与封装实践
开发语言·python
DLYSB_1 小时前
API 网关流量洪峰与突发 CC 攻击:我用 Go 写了个“现场物理防御哨兵”,把故障响应压缩到秒级
开发语言·后端·golang·报警灯
markinmarkin2 小时前
Spring 中Bean 的作用域有哪些?
java·后端·spring
山荷枝3 小时前
Java学习第十天
java·学习
matlabgoodboy3 小时前
计算机毕设代做|Java Python Matlab APP 全套开发设计
java·python·课程设计
雨田言炎3 小时前
四、关于Qt项目需要知道的
开发语言·笔记·qt
程序喵大人4 小时前
【C++进阶】STL算法与函数对象 - 02 sort为什么需要随机访问迭代器
开发语言·c++·算法
SomeB1oody4 小时前
【RustyML入门】2.6. 线性判别分析
开发语言·后端·机器学习·rust·教程
程序员雷欧4 小时前
环形缓冲区深度解析:从基础原理到Disruptor源码的全面剖析
java
xiaoqiMikko4 小时前
Dependabot 面板全绿,不代表你的 Tomcat 没洞
java·spring boot