Lombok @With注解在子类无法作用于抽象父类字段问题咨询
问题原因与解决方案
核心问题
Lombok默认不会自动将父类@With生成的字段修改方法整合到子类中,尤其是父类为抽象类且配合@SuperBuilder使用时,需要调整注解配置才能让子类继承父类字段的withXXX方法能力。
具体修正步骤
1. 移除子类自定义构造函数
你手动编写的Child构造函数会和@SuperBuilder生成的构造逻辑冲突,导致Lombok无法正确处理父类字段的with方法生成,直接删除该自定义构造函数即可。
2. 调整Lombok注解配置
- 父类保持原有注解不变
- 子类移除
@With注解,添加toBuilder = true到@SuperBuilder中(该配置会让子类自动继承父类@With生成的字段修改能力);同时给@EqualsAndHashCode和@ToString加上callSuper = true,确保父类字段也能参与equals、hashCode和toString逻辑
修正后的代码
父类Parent
@AllArgsConstructor @Getter @SuperBuilder @With public abstract class Parent { protected int c; }
子类Child
@Getter @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @SuperBuilder(toBuilder = true) public class Child extends Parent { private float a; private int b; }
3. 验证使用方式
现在可以通过子类实例直接调用父类字段的with方法,同时也能修改子类自身字段:
// 创建子类实例 Child child = Child.builder() .a(1.0f) .b(2) .c(3) .build(); // 修改父类字段c,生成新的Child实例 Child updatedChild = child.withC(5); // 修改子类字段a,生成新的Child实例 Child anotherUpdated = updatedChild.withA(2.5f);
4. 确保Lombok版本达标
必须使用Lombok 1.18.16及以上版本,从该版本开始@SuperBuilder才完全支持与@With的配合使用,以及父类字段方法的继承。
内容的提问来源于stack exchange,提问作者eyal tamsot
相关产品推荐
相关产品推荐

