自定义龙目岛超级构建器

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)

Jan*_*eke 5

生成的代码@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 开始,您可以自定义构造函数。