@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
相关推荐
「QT(C++)开发工程师」4 小时前
C++ 11 常用for循环
开发语言·c++
我还记得那天4 小时前
0 初识C++
开发语言·c++
FfHUCisI4 小时前
Go 编译过程全景
开发语言·后端·golang
FfHUCisI4 小时前
Golang 语法分析与 AST:Parser 与 go/ast
开发语言·后端·golang
秋饼5 小时前
JDK 27 企业级 AI 服务落地实战:G1 默认、紧凑对象头、后量子 TLS 与 JFR 脱敏全解析
java·ai·技术分享·后端开发
卓怡学长5 小时前
w176基于SpringBoot的医院管理系统
java·spring boot·spring·maven·intellij-idea
lemon_sjdk5 小时前
ObjectProperty
java·开发语言·算法
大模型码小白6 小时前
Spring AI Tool 实现自然语言操作 MySQL 数据库详解
服务器·开发语言·数据库·人工智能·python·mysql·spring
hh9506 小时前
Agent Plan x DeepSeek Harness:Agent 供应链安全与第三方插件审计
java·开发语言·安全·agent plan·adg成都社区·adg社区