定制龙目岛超级建造者

问题描述 投票:2回答:1

我有一个父抽象类 "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);
       }
    }
}
java builder lombok
1个回答
1
投票

生成的代码为 @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版本中将会实现。当它发布时,我会更新这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.