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

如何在带有final字段的抽象类上使用Lombok@SuperBuilder

穆招
2023-03-14

给定以下具有Lombok注释的类@data@superbuilder

@Data
@SuperBuilder
public abstract class Parent {

    protected final String userId;
    protected final Instant requestingTime;
}

@Data
@SuperBuilder
public class Child extends Parent {

    private final Instant beginningDate;
    private final Instant endingDate;
    private final Collection<String> fields;
}

子类中的@data注释上出现以下错误:

隐式超级构造函数Parent()未定义。必须显式调用另一个构造函数。

我在子类和父类上尝试了@data@getter@setter注释与@superbuilder注释的几种不同组合,但还没有找到一个有效的解决方案。我使用的是Lombok 1.18.10。

供参考,这个问题是相关的

编辑

public Child(
    final String userId,
    final Instant requestingTime,
    final Instant beginningDate,
    final Instant endingDate,
    final Collection<String> fields) {

    super(userId, requestingTime);
    this.beginningDate = beginningDate;
    this.endingDate = endingDate;
    this.fields= fields;
}
final Child child = Child.Builder()
                         .userId(<value>)
                         .requestingTime(<value>)
                         .beginningDate(<value>)
                         .endingDate(<value>)
                         .fields(<value>)
                         .build();

共有1个答案

佴涵蓄
2023-03-14

AFAIK,@data生成@noargsconstructor,这是错误的。实际上,@data本身是错误的,因为它是针对可变类的;@value会更好,但它也不能处理超级构造函数。

因此,删除@data,添加@getter@equalsandhashcode@tostring和您需要的任何东西。不要忘记在子类中添加callsuper=true

这实际上是Lombok应该在superbuilder.build()操作上构造和调用的构造函数。

public Child(
    final String userId,
    final Instant requestingTime,
    final Instant beginningDate,
    final Instant endingDate,
    final Collection<String> fields) {

    super(userId, requestingTime);
    this.beginningDate = beginningDate;
    this.endingDate = endingDate;
    this.fields= fields;
}
public Child(ChildBuilder b) {    
    super(b);
    this.beginningDate = b.beginningDate;
    this.endingDate = b.endingDate;
    this.fields= b.fields;
}

你可以相信Jan Rieke说的,是他写的。

 类似资料:
  • 我目前正试图用lombok删除一些样板代码,但遇到了一些问题。 我有一个抽象类AbstractParent, 然后我有一个像这样的儿童班 我还有一些类扩展了Child类 由于Lombok不能在构造函数中使用超级,我尝试了@SuperBuilder注释,而不是手动定义构造函数,但无法启动应用程序。我是不是完全错过了什么?龙目岛和Spring有可能吗? 错误是:

  • 我有以下课程: 为什么我无法在抽象类(< code>Parent)的实例上调用< code>toBuilder(),如下面的代码所示?

  • 我有扩展抽象类的类,我不想把放在所有子类的顶部。 有没有办法为抽象类实现Lombok?

  • 本文向大家介绍抽象类能使用 final 修饰吗?相关面试题,主要包含被问及抽象类能使用 final 修饰吗?时的应答技巧和注意事项,需要的朋友参考一下 不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类,如下图所示,编辑器也会提示错误信息:

  • 我的班级等级如下: 并尝试将DTO映射到实体 地图如下: 我在详细信息字段中收到带有A或B的DTO,这是在调试器中检查的。但是模型制图者投掷 无法实例化目标组织的实例。包裹基础确保该组织。包裹Base有一个非私有的无参数构造函数。 我尝试使用显式提供程序(没有用于此映射): 我还尝试像这样实现自定义转换器(也没有执行): 模型映射器似乎没有对字段使用这个类型映射,只对hierarhy的根使用。在这

  • 我通过学校为一项任务提供的简报创建了一个飞机座位预订系统。我遇到了一个我无法解决的主要问题。 摘要说明抽象类必须有一个抽象方法和大约4个公共方法。在抽象类的两个子类中,我们都必须初始化对象数组(所有普通的座位)。然而,一旦它们被初始化,我不知道如何将它们发送回抽象类(该类有一个检查未预订的飞机座位的方法,这就是我需要初始化的座位对象的地方) ArrayIndexOutOfBounds在一个应该在边