@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
相关推荐
行思理几秒前
Nginx 跨站请求(CORS)配置完全指南:从原理到生产实践
java·前端·nginx
小溪学编程9 分钟前
Spring @Bean 与 @Component 注解的区别详解
java·后端·spring
Wang's Blog35 分钟前
Java 项目实战: 交友项目 - 圈子互动章总结与自检清单
java·bootstrap·交友
云和数据.ChenGuang1 小时前
Python 常见特殊方法详解:__new__、__init__、__del__、__str__、__repr__ 与 __getattribute__
开发语言·人工智能·python·1024程序员节
xyouyuweizhu1 小时前
字节流与字符流:Java IO 的两条主线该怎么选
java·开发语言·python
代码方舟1 小时前
零信任架构实战:基于天远人企关联构建自动化供应链核心企业关联穿透与利益冲突审查网关
java·人工智能·架构·自动化
多弗朗皮卡丘2 小时前
C++的IO流
开发语言·c++·io流·文件io流
liyi_hz20082 小时前
O2OA(翱途) V10.1 即将发布|功能再升级,安全再加固,协同更高效!
java·javascript·windows·开源软件
骑着蜗牛撵大象3272 小时前
AI Agent 工程化开发实战(三):用 StateGraph 给智能体搭一条可回放的状态流水线
java·开发语言·jvm·ai·状态管理·langgraph·stategraph
itmigrate2 小时前
Rust 里的所有权误区:不是不写 clone 就叫高性能
开发语言·后端·rust