如何自定义Lombok @SuperBuilder的build方法以自动执行后续逻辑?
自定义Lombok @SuperBuilder的build方法
因为@SuperBuilder生成的builder是泛型抽象类,和@Builder的普通静态内部类结构不同,直接覆盖build()方法会失效。可以通过以下几种方式实现自动调用方法的需求:
方法1:重写泛型builder的build方法
@SuperBuilder(buildMethodName = "internalBuild") public class Foo { private String name; private int age; // 需要自动调用的方法 public Foo someMethod() { // 这里编写你的业务逻辑,比如参数校验、初始化操作 this.name = this.name != null ? this.name.toUpperCase() : null; return this; } // 继承Lombok生成的泛型Builder类,重写build方法 public static class FooBuilderImpl extends FooBuilder<Foo, FooBuilderImpl> { @Override public Foo build() { return internalBuild().someMethod(); } } }
说明:
- 通过
buildMethodName = "internalBuild"让Lombok把原始的构建方法重命名,避免和自定义的build()冲突 - 继承自动生成的
FooBuilder泛型类,泛型参数指定当前实体类Foo和builder自身FooBuilderImpl - 重写
build()方法,先调用Lombok生成的internalBuild()创建实例,再自动执行someMethod()
方法2:在构造函数中直接调用
如果不需要依赖builder的特殊逻辑,可以直接在类的构造函数中调用目标方法,这样无论通过builder还是其他方式创建实例,都会自动执行:
@SuperBuilder public class Foo { private String name; private int age; // 手动编写构造函数,调用目标方法 private Foo(FooBuilder<?, ?> builder) { this.name = builder.name; this.age = builder.age; someMethod(); } public void someMethod() { this.name = this.name != null ? this.name.toUpperCase() : null; } }
注意:如果父类也使用了@SuperBuilder,需要确保构造函数的调用链正确传递参数。
方法3:Spring环境下用@PostConstruct
如果你的类是Spring Bean,可以直接给目标方法加上@PostConstruct注解,Spring初始化Bean时会自动执行该方法,无需修改builder逻辑:
@SuperBuilder @Component public class Foo { private String name; private int age; @PostConstruct public void someMethod() { this.name = this.name != null ? this.name.toUpperCase() : null; } }
内容的提问来源于stack exchange,提问作者Rurien
相关产品推荐
相关产品推荐

