自定义 lombok 超级生成器

Customize lombok super builder

我有父摘要 class "Parent" 和子摘要 class "Child"。我正在使用 @SuperBuilder 生成构建器 API。现在,作为构建的一部分,我想对 class "Parent" 和 "Child" 的成员执行一些验证。我找不到任何自定义 lombok super builder 的解决方案。根据 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);
       }
    }
}

@SuperBuilder 生成的代码很复杂并且加载了类型参数。因此,建议 delombok 您的 class 并将输出用作参考。

您可以使用以下命令执行此操作:

java -jar path/to/lombok.jar delombok -p path/to/src/main/java/Child.java

输出将显示 lombok 生成的代码。我假设 Child class 不是抽象的(我认为你的问题有错字)。您要自定义 build() 方法,因此您对 ChildBuilderImpl 感兴趣,因为此 class 包含该方法。您可以将 class header 复制到源文件并添加自定义 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);
    }
}

备注:我更喜欢在构造函数中执行验证,因为否则您可以以编程方式调用构造函数而不验证值。但是,目前无法自定义 @SuperBuilder 构造函数;下一个 lombok 版本将成为可能。我会在发布时更新这个问题。