如何利用Lombok特性基于已有Parent实例构建Child实例(无需逐字段赋值)
如何利用Lombok特性基于已有Parent实例构建Child实例(无需逐字段赋值)
嘿,这个需求完全可以用Lombok的特性轻松搞定,根本不用手动逐字段赋值,我来给你一步步讲清楚怎么实现~
首先,你已经在Parent和Child类上都加了@SuperBuilder(toBuilder = true),这个注解就是关键!它本身就支持父类与子类的builder继承,能自动帮你把父类的字段值传递过去。
方法一:直接用Child的builder结合parent()方法
Lombok的@SuperBuilder会自动在Child的Builder类中生成一个parent(Parent parent)方法,这个方法会把传入的Parent实例的所有字段值,一键复制到Child Builder对应的父类字段里。
举个实际的代码例子:
首先你有一个已初始化的Parent实例:
Parent existingParent = Parent.builder() .id("PARENT_001") .field1(100L) .field2(200L) .field3(300L) .build();
然后直接用这个实例构建Child,同时补充子类属性:
Child child = Child.builder() .parent(existingParent) // 这一步就把Parent的所有字段都填好了 .prop1(10) .prop2(20) .prop3(30) .build();
这样就搞定了,完全不用手动写field1(existingParent.getField1())这种重复代码!
方法二:自定义fromParent静态方法,贴合你想要的语法
如果你更偏好Child.fromParent(parent).prop1(10).build()这种更直观的写法,也可以在Child类里加一个简单的静态方法,复用Lombok生成的builder:
@Data @EqualsAndHashCode(callSuper = true) @SuperBuilder(toBuilder = true) @NoArgsConstructor @AllArgsConstructor public class Child extends Parent { private Integer prop1; private Integer prop2; private Integer prop3; // 新增这个静态方法 public static ChildBuilder<?, ?> fromParent(Parent parent) { return Child.builder().parent(parent); } }
现在你就可以用你最开始想要的写法了:
Child child = Child.fromParent(existingParent) .prop1(10) .prop2(20) .build();
注意事项
- 确保你的Lombok版本不低于1.18.2,因为
@SuperBuilder是从这个版本开始正式支持的 - 要保证IDE的Lombok插件已经启用,并且项目的maven/gradle依赖配置正确,不然可能会出现IDE提示错误但编译正常的情况
备注:内容来源于stack exchange,提问作者Ricardo Henrique Comar
相关产品推荐
相关产品推荐

