使用 @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 |