abi*_*abi 4 java builder lombok
我有一个父抽象类“Parent”和子类“Child”。我正在使用 @SuperBuilder 生成构建器 API。现在,作为构建的一部分,我想对“Parent”和“Child”类的成员执行一些验证。我找不到任何解决方案来自定义龙目岛超级构建器。根据lombok文档,这似乎是可能的。有人可以解释一下吗?
@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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
生成的代码@SuperBuilder很复杂并且加载了类型参数。因此,建议delombok您的班级使用输出作为参考。
您可以使用以下命令执行此操作:
java -jar path/to/lombok.jar delombok -p path/to/src/main/java/Child.java
Run Code Online (Sandbox Code Playgroud)
输出将显示 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);
}
}
Run Code Online (Sandbox Code Playgroud)
备注:我更喜欢在构造函数中执行验证,因为否则您可以以编程方式调用构造函数,而无需验证值。然而,@SuperBuilder目前还无法自定义构造函数;下一个 lombok 版本将有可能实现。当这个问题发布时,我会更新它。
更新:从 Lombok v1.18.16 开始,您可以自定义构造函数。
| 归档时间: |
|
| 查看次数: |
2260 次 |
| 最近记录: |