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

使用Lombok的类层次结构的通用生成器基实例

闻人嘉木
2023-03-14

我有一个具有单个抽象基类和几个子类的类层次结构。基类有25个字段,每个子类有一个额外的0-8个字段。

@AllArgsConstructor
@Data
public abstract class Base {
   private int b1, b2, ... , b25;
}

public class C1 extends Base {
   private int c11, c12, ... , c16;

   @Builder
   private C1(int b1, int b2, ..., int b25, int c11, ... int c16) {
       super(b1, b2, ...., b25);
       this.c11 = c11;
       ...
       this.c16 = c16;
   }
}

public class C2 extends Base {

   @Builder
   private C2(int b1, int b2, ..., int b25) {
       super(b1, b2, ...., b25);
   }
}
C1 c1 = C1.builder().b1(1).b2(2)....b25(25).c11(101).c12(102).build();
C2 c2 = C2.builder().b1(1).b2(2)....b25(25).build();
public void setBValues(BValuesProvider bv, // what else goes here??? //) {
    // something.b1(bv.b1()).b2(bv.b2()) ...
}

public createC1(BValuesProvider bv, c11, c12, ..., c16) {
    C1.Builder c1b = C1.builder().c11(c11).c12(c12)....c16(c16);
    // Call setBValues somehow
    return c1b.build();
}

public createC2(BValuesProvider bv) {
    // Call setBValues somehow
    return c2b.build();
}
public void setBValues(BValuesProvider bv, Base cx) {
    cx.setB1(bv.b1());
    cx.setB2(bv.b2());
    ...
    cx.setB25(bv.b25());
}

public createC1(BValuesProvider bv, c11, c12, ..., c16) {
    C1 c1 = C1.builder().c11(c11).c12(c12)....c16(c16).build();
    setBValues(bv, c1);
    return c1;
}

public createC2(BValuesProvider bv) {
    C2 c2 = C2.builder().build();
    setBValues(bv, c2);
    return c2;
}
  • 生成器模式和继承
  • 对Java Builder类进行子类化
  • 如何在龙目岛调用超级构造函数

然而,他们没有一个谈到有一个“基构建器”,每个子构建器都是它的一个子类。因此,我无法确定使用泛型,setbvalues函数的第二个参数应该是什么。

共有1个答案

范金鑫
2023-03-14

这可以使用(实验性的)@superbuilder注释和lombok>=1.18.4来实现。您可以自定义base@superbuilder,方法是添加一个方法,该方法将BValuesProvider作为参数并从中设置所有值:

@SuperBuilder
public abstract class Base {
    public static abstract class BaseBuilder<C extends Base, B extends BaseBuilder<C, B>> {
        public B fillFromProvider(BValuesProvider bv) {
            b1(bv.b1());
            b2(bv.b2());
            ...
            return self();
        }
    }
    ...
}

那么您可以这样使用它(其中BVBValuesProvider实例):

C1 c1 = C1.builder().fillFromProvider(bv).c11(11).build();
 类似资料:
  • 我读过其他关于龙目岛的构建器和继承的问题,但没有一个解决方案奏效。使用Lombok版本1.18.4和Java11。 和实际的实现: 我希望龙目岛 识别父类所需的字段。 在生成的子类生成器中包含这些字段。 问题是,IntelliJ突出显示了注释,并带有以下错误: Lombok需要基类中的默认构造函数。 如果从中删除,则会出现以下错误: 基类中没有可用的默认构造函数。 因此,我从中删除了,并添加了一个

  • 我有一个类的层次结构:是一个基本抽象类

  • 问题内容: 是否可以基于层次结构/ cte创建视图? 我看过一个有关如何基于链接递归查询生成结果集的示例。 我已经附上了ddl和声明。 谢谢你, 埃尔默 问题答案: 后已被指定(超出右括号),您需要选择从CTE的所有值: 这是构成视图的实际选择查询。 这是一个完整的工作示例,其中选择了视图的最终输出,以及一些其他语句,以允许这些语句在SQL Server Management Studio中一次执

  • 使用lombok,我感兴趣的是通过基类实例的构造函数将所有字段复制到派生类,这与C copy构造函数的功能非常相似。目前,人们关注的并不是这本书是深的还是浅的。我有一个基类,如下所示, 我感兴趣的是自动生成一个派生类构造函数,它接受基类实例,并将所有字段(浅或深)复制到派生类。例如 我可以根据需要灵活地注释父类和子类,但是我不想手工创建构造函数,它会逐个复制每个字段。示例用法

  • 解决方案: 我不得不更改我的和的顺序。 我必须将放在之上,然后它就起作用了。 我将下面的pom更新到工作版本,所以这里没有非工作代码。 我还将lombok版本转换回当前版本,而不是使用edge版本。 原始问题: 我有2个或多或少相同的类集(见下面的示例) 一组是我的API的DTO,我希望它是不可变的,使用Lombok的@Value和@Builder 一组是要存储在数据库中的实体。使用Lombok的

  • 问题内容: 从Java 8开始,我知道类加载器的层次结构如下: Bootstrap类加载器→扩展类加载器→应用程序类加载器 Java 9中的类加载器的层次结构发生了什么变化,它如何起作用? 问题答案: 在 Java中,9个州修订如下: Java运行时具有以下内置的类加载器: :虚拟机的内置类加载器通常表示为null,并且没有父级。 :为了允许升级/覆盖定义到平台类加载器的模块,以及允许升级的模块读