@SuperBuilder

    28

@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

  1. 继承支持:
// @Builder不支持继承,会导致父类属性无法设置
@Builder  // 错误使用
public class Child extends Parent { }

// @SuperBuilder支持继承
@SuperBuilder  // 正确使用
public class Child extends Parent { }
  1. 注解要求:
@SuperBuilder
@NoArgsConstructor   // @SuperBuilder需要无参构造
@AllArgsConstructor  // @SuperBuilder需要全参构造
public class Parent { }

@Builder  // @Builder不需要额外的构造器注解
public class Simple { }
  1. 默认值支持:
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class BasePageReq {
    @Builder.Default    // 支持默认值
    private Integer current = 1;
    @Builder.Default
    private Integer pageSize = 10;
}

最佳实践

  1. 实体类定义:
@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;
}
  1. 子类定义:
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class GetAllCompetitionsReq extends BasePageReq {
    private String name;
    
    @Builder.Default
    private CompetitionStatus status = CompetitionStatus.ALL;
}
  1. 使用示例:
@Service
@RequiredArgsConstructor
public class CompetitionServiceImpl implements CompetitionService {
    
    public IPage<Competition> searchCompetitions() {
        GetAllCompetitionsReq req = GetAllCompetitionsReq.builder()
            // 只需设置需要的属性,其他使用默认值
            .pageSize(20)
            .status(CompetitionStatus.ONGOING)
            .build();
        // ...
    }
}

使用@SuperBuilder的优点:

  1. 支持继承关系
  2. 支持属性默认值
  3. 代码更简洁优雅
  4. 构建对象更灵活

注意事项:

  1. 需要配合@NoArgsConstructor@AllArgsConstructor使用
  2. 父类和所有子类都需要加@SuperBuilder注解
  3. 使用@Builder.Default设置默认值

Comments | 0 评论
消息盒子

# 暂无消息 #

只显示最新10条未读和已读信息