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

在抽象类上使用Lombok@SuperBuilder注释和toBuilder?

许正平
2023-03-14

我有以下课程:

@SuperBuilder(toBuilder = true)
public abstract class Parent {
    //...
}

@SuperBuilder(toBuilder = true)
public class Child extends Parent {
    //...
}

@SuperBuilder(toBuilder = true)
public class Child2 extends Parent {
    //...
}

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

public copy(Parent parent) {
    parent.toBuilder().build();
}

共有2个答案

司徒志
2023-03-14

这可能是因为Lombok不能保证< code>Parent的每个子类也标记为< code > @ super builder(toBuilder = true),如果是这样,Lombok就不能调用该实例的< code > toBuilder ;

安奇
2023-03-14

事实上,正如Hossein Nasr已经解释的那样,Lombok无法知道是否存在没有toBuilder=true的子类。

Lombok 可以通过在抽象类上添加抽象 toBuilder() 方法来要求抽象类的所有直接子类也使用 toBuilder。但是,可能存在子类不应该有toBuilder的用例(尽管我还没有看到任何好的例子)。此外,间接子类可能仍然缺少 toBuilder 功能。因此,lombok 不会在抽象类的子类上强制执行 toBuilder

好消息是,您可以通过手动将抽象 toBuilder() 方法添加到抽象类 Parent 中,轻松地解决它(仅直接子类):

@SuperBuilder(toBuilder = true)
public abstract class Parent {
    public abstract ParentBuilder<?, ?> toBuilder();
}

通过此更改,复制方法将按预期编译和工作。

如果您还有间接子类,您必须找到其他方法来确保它们也有< code > @ super builder(to builder = true)。如果没有这个注释,您可能会遇到奇怪的行为(例如,调用< code>copy()将实例化一个不同的类)。

免责声明:我实现了@SuperBuilder功能。

 类似资料:
  • 给定以下具有Lombok注释的类和 在中的注释上出现以下错误: 隐式超级构造函数Parent()未定义。必须显式调用另一个构造函数。 我在子类和父类上尝试了、、注释与注释的几种不同组合,但还没有找到一个有效的解决方案。我使用的是Lombok 1.18.10。 供参考,这个问题是相关的 编辑

  • 问题内容: 我有一个非常简单的抽象类 现在您可以看到,我正在尝试自动连接DatabaseModel。但是在我的扩展类中,我只为dbModel接收null。 问题:我在这里尝试一些不可能的事情吗? 问题答案: 您的设置似乎很好。原因也许在其他地方。也许您正在使用实例化该类,而不是让spring这样做。

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

  • 我有一把刀: 问题是,当我试图使用DAO进行加载调用时,使用DynamoDBMapper以field d1作为哈希键来获取项目,它会抛出一个DynamoDBExc0019,说:为公共DAO. getField2()找到了空键,但实际上表的值对应于field d2。问题,这是因为Lombok注释而不是手动突变代码,还是一般来说我们一起使用Lombok和DynamoDBAnnotions?

  • 我能以某种方式将一组注释分组到一个抽象类上,并且每个扩展该类的类都自动分配了这些注释吗? 至少以下内容不起作用:

  • 我有一个JHipster项目,我在build.gradle中添加了对Lombok的依赖: 我为IntelliJ安装了Lombok插件。我已经在IntelliJ中打开了注释处理,我可以在IntelliJ IDE中生成而不出错,但是当我尝试从命令行生成时,会出现生成错误。Gradle似乎没有处理注释,也找不到getter/setter和log声明。项目运行时也不会出现任何错误。 命令行: 错误: 错误