@SuperBuilder
@SuperBuilder
是Lombok提供的一个注解,用于生成构建者模式代码,特别适用于继承关系的类。它是@Builder
的增强版本。
基本用法
@Data
@SuperBuilder
@NoArgsConstructor // 必需
@AllArgsConstructor // 必需
public class BasePageReq {
private Integer current;
private Integer pageSize;
private String column;
private QueryOrder order;
}
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class GetAllCompetitionsReq extends BasePageReq {
private String name;
private CompetitionStatus status;
}
使用示例
// 使用建造者模式创建对象
GetAllCompetitionsReq req = GetAllCompetitionsReq.builder()
// 设置父类属性
.current(1)
.pageSize(10)
.column("created_time")
.order(QueryOrder.DESC)
// 设置子类属性
.name("比赛")
.status(CompetitionStatus.ONGOING)
.build();
@SuperBuilder vs @Builder
- 继承支持:
// @Builder不支持继承,会导致父类属性无法设置
@Builder // 错误使用
public class Child extends Parent { }
// @SuperBuilder支持继承
@SuperBuilder // 正确使用
public class Child extends Parent { }
- 注解要求:
@SuperBuilder
@NoArgsConstructor // @SuperBuilder需要无参构造
@AllArgsConstructor // @SuperBuilder需要全参构造
public class Parent { }
@Builder // @Builder不需要额外的构造器注解
public class Simple { }
- 默认值支持:
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class BasePageReq {
@Builder.Default // 支持默认值
private Integer current = 1;
@Builder.Default
private Integer pageSize = 10;
}
最佳实践
- 实体类定义:
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class BasePageReq {
@Builder.Default
private Integer current = 1;
@Builder.Default
private Integer pageSize = 10;
@Builder.Default
private String column = "created_time";
@Builder.Default
private QueryOrder order = QueryOrder.DESC;
}
- 子类定义:
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class GetAllCompetitionsReq extends BasePageReq {
private String name;
@Builder.Default
private CompetitionStatus status = CompetitionStatus.ALL;
}
- 使用示例:
@Service
@RequiredArgsConstructor
public class CompetitionServiceImpl implements CompetitionService {
public IPage<Competition> searchCompetitions() {
GetAllCompetitionsReq req = GetAllCompetitionsReq.builder()
// 只需设置需要的属性,其他使用默认值
.pageSize(20)
.status(CompetitionStatus.ONGOING)
.build();
// ...
}
}
使用@SuperBuilder
的优点:
- 支持继承关系
- 支持属性默认值
- 代码更简洁优雅
- 构建对象更灵活
注意事项:
- 需要配合
@NoArgsConstructor
和@AllArgsConstructor
使用 - 父类和所有子类都需要加
@SuperBuilder
注解 - 使用
@Builder.Default
设置默认值