当前位置: 首页 > 知识库问答 >
问题:

自定义lombok超级构建器

夏侯臻
2023-03-14
@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);
       }
    }
}

共有1个答案

盖晋
2023-03-14

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

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

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

输出将显示lombok生成的代码。我假设子类不是抽象的(我认为您的问题中有一个错误)。您希望自定义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);
    }
}
 类似资料:
  • 我在代码中使用Lombok自动生成getter和setter代码。我想添加其他个人注释并使用它。 例如,我想添加一个方法来验证列表中是否存在一个键: 创建注释后,我将执行以下操作:

  • android { dexOptions { incremental false preDexLibraries = false jumboMode = false javaMaxHeapSize "2048M" } } 这将会影响到所有使用 dex 的 task。

  • android { aaptOptions { noCompress 'foo', 'bar' ignoreAssetsPattern "!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~" } } 这将会影响所有使用 aapt 的 task。

  • 一般的 Java 项目中有一组 task 用于协同处理并最终生成一个输出。 classes task 用于编译 Java 源代码。 可以在 build.gradle 文件中使用 classes 访问 classes task 。classes 是 project.tasks.classes 的缩写。 相比之下在 Android 项目中这就有点复杂。因为 Android 项目中会有大量相同的 tas

  • ProGuard 插件是自动添加进来的,如果 Build Type 的 minifyEnabled 属性被设置为 true,对应的 task 将会自动创建。 android { buildTypes { release { minifyEnabled true proguardFile getDefaultProguardFi

  • 3.4.2 构建类型 默认情况下,Android plugin 会自动的设置工程,构建 release 和 debug 两个版本。 他们主要的差异主要在于是否可以在设备上调试应用以及APK如何签名。 debug 版本会被使用已知的名称/密码自动生成的密钥/证书签名。release 版本在构建过程中不会被签名,需要构建后再签名。 这些配置可以通过一个叫 BuildType 配置。默认情况下,已经创建