使用 Lombok 的 @Builder注解时,如果子类继承自父类,默认情况下构建器只会包含子类自己定义的字段,而不包含父类的字段

问题

在使用 Lombok 的 @Builder 注解时,如果子类继承自父类,默认情况下构建器只会包含子类自己定义的字段,而不包含父类的字段,这就导致无法通过构建器为父类字段赋值。

核心原因@Builder 默认只为当前类的字段生成构建器方法,不会自动处理父类的字段。

示例

假设有一个父类 Person 和一个子类 Employee

@Data
@Builder
public class Person {
    private String name;
    private int age;
}

@Data
@Builder
public class Employee extends Person {
    private String employeeId;
}

使用构建器创建 Employee 对象时:

Employee employee = Employee.builder()
    .name("张三")      // 错误!父类字段无法通过子类构建器访问
    .age(30)          // 错误!父类字段无法通过子类构建器访问
    .employeeId("E123") // 正确,子类自己的字段可以正常访问
    .build();

问题表现:上述代码会报错,IDE 提示找不到 nameage 方法,因为 Employee 的构建器只包含 employeeId 字段。

解决方案

1. 使用 @SuperBuilder(推荐)
@Data
@SuperBuilder
public class Person {
    private String name;
    private int age;
}

@Data
@SuperBuilder
public class Employee extends Person {
    private String employeeId;
}

此时可以正常使用构建器:

Employee employee = Employee.builder()
    .name("张三")      // 正确,父类字段可以通过子类构建器访问
    .age(30)          // 正确
    .employeeId("E123")
    .build();
2. 在父类启用 toBuilder
@Data
@Builder(toBuilder = true)  // 启用 toBuilder
public class Person {
    private String name;
    private int age;
}

@Data
@Builder
public class Employee extends Person {
    private String employeeId;
}

使用方式:

Employee employee = Employee.builder()
    .employeeId("E123")
    .build()
    .toBuilder()  // 先构建,再通过 toBuilder 修改父类字段
    .name("张三")
    .age(30)
    .build();

这种方式稍显繁琐,不如 @SuperBuilder 简洁直接。

总结

  • 使用 @Builder 时,父类字段默认不会出现在子类构建器中
  • 推荐使用 @SuperBuilder 解决继承场景下的构建器问题,它能自动包含父类和子类的所有字段。
  • 确保 Lombok 版本在 1.18.16 以上,以支持 @SuperBuilder 注解。

你可能感兴趣的:(python,java,前端)