我有一个父抽象类 "Parent "和子类 "Child"。我使用@SuperBuilder来生成构建器API。现在,我想对 "Parent "和 "Child "类的成员进行一些验证,作为构建的一部分。我找不到任何解决方案来定制lombok超级构建器。根据 龙目岛 doc,看来是可以的。谁能给点启示?
@SuperBuilder
public abstract class Parent {
int x;
int y;
int z;
int a;
}
@SuperBuilder
public abstract class Child extends Parent {
int b;
int c;
int d;
// I want something like
public static class ChildBuilder {
public Child build() {
Child child = // Get child somehow;
validate(child);
}
}
}
生成的代码为 @SuperBuilder
是复杂的,并且带有类型参数。因此,建议使用 delombok
并使用输出作为参考。
你可以用这个命令来做。
java -jar path/to/lombok.jar delombok -p path/to/src/main/java/Child.java
输出将显示lombok生成的代码. 我假设 Child
类不是抽象的(我想你的问题中有一个错别字)。你想自定义 build()
方法,所以你对 ChildBuilderImpl
因为这个类包含了该方法。你可以把类头复制到你的源文件中,然后添加你的自定义的 build()
方法。
private static final class ChildBuilderImpl extends Child.ChildBuilder<Child, Child.ChildBuilderImpl> {
@java.lang.Override
public Child build() {
// Do validation here, e.g.:
if (((Child.ChildBuilder<?, ?>)this).b == 0)
throw new IllegalArgumentException("b must not be 0");
return new Child(this);
}
}
Remark: 我更倾向于在构造函数中执行验证,因为否则你可以以编程方式调用构造函数,而不对值进行验证。然而,自定义 @SuperBuilder
构造函数目前是不可能的,在下一个lombok版本中将会实现。当它发布时,我会更新这个问题。