我有一个父抽象类“Parent”和子类“Child”。我正在使用 @SuperBuilder 生成构建器 API。现在,我想对“Parent”和“Child”类的成员执行一些验证,作为构建的一部分。我找不到任何解决方案来自定义龙目岛超级构建器。按照lombok https://projectlombok.org/features/experimental/SuperBuilder博士,这似乎是可能的。有人可以解释一下吗?
@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()
method:
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);
}
}
备注:我更喜欢在构造函数中执行验证,因为否则您可以以编程方式调用构造函数,而无需验证值。然而,定制@SuperBuilder
目前无法使用构造函数;下一个 lombok 版本将有可能实现。当这个问题发布时,我会更新它。
更新:从 Lombok v1.18.16 开始,您可以自定义构造函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)