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

类结构复杂的Lombok生成器继承

澹台举
2023-03-14

我读过其他关于龙目岛的构建器和继承的问题,但没有一个解决方案奏效。使用Lombok版本1.18.4和Java11。

public interface FooInterface {
    String getFoo();
}
@Data
@SuperBuilder
public abstract class AbstractFoo implements FooInterface {

    @Builder.Default
    private final String foo = "foo";

}

和实际的foo实现:

@Data
@SuperBuilder
public class FooTest extends AbstractFoo {
    private final String bar;
}

我希望龙目岛

  1. 识别父类所需的字段。
  2. 在生成的子类生成器中包含这些字段。
final FooInterface fooTest = FooTest.builder.foo("string").bar("string").build();
assertThat("string").equals(fooTest.getFoo());
assertThat("string").equals(fooTest.getBar());

问题是,IntelliJ突出显示了@data注释,并带有以下错误:

Lombok需要基类中的默认构造函数。

如果从footest中删除@data,则会出现以下错误:

基类中没有可用的默认构造函数。

因此,我从abstractfoo中删除了@superbuilder,并添加了一个带有所有参数的手动创建的构造函数。错误仍然存在。我尝试过其他的方法和注释组合,但都不奏效。

我还尝试将所有abstractfoo字段设置为protected final,并声明Foo实现本身final,这与我的业务规则是一致的,但没有成功。

共有1个答案

公良奇
2023-03-14

@superbuilder不受当前版本的IntelliJ IDEA插件支持。

Project的Github Tracker-https://Github.com/mplushnikov/lombok-intellij-plugin/issues/513上有一个公开的问题

虽然它的目标是几天前才发布的0.25版本-https://github.com/mplushnikov/lombok-intellij-plugin/releases/tag/releasebuild_0.25

问题似乎仍未解决,尚未落实。

我建议只尝试0.25版本,如果它不起作用,等待下一个版本。

 类似资料:
  • 我有一个具有单个抽象基类和几个子类的类层次结构。基类有25个字段,每个子类有一个额外的0-8个字段。 生成器模式和继承 对Java Builder类进行子类化 如何在龙目岛调用超级构造函数 然而,他们没有一个谈到有一个“基构建器”,每个子构建器都是它的一个子类。因此,我无法确定使用泛型,函数的第二个参数应该是什么。

  • Java Lombok库:继承的生成器注释问题 创建子类的实例时,父类属性在生成器注释中不可见。 以下失败: 然而,下面的说法是正确的: 似乎这个问题已经存在很长时间了,不知道最新版本是否有任何修正。

  • 问题内容: 可以说我有一个散列,例如 存储这种数据结构的“通常”方式是什么(或者您不会吗?) 您是否可以直接获得价值(例如,获取哈利:年龄? 一旦存储,您是否可以直接更改子键的值(例如,sally:weight = 100) 问题答案: 存储这种数据结构的“通常”方式是什么(或者您不会吗?) 例如,哈利(Harry)和莎莉(Sally)将分别存储在单独的散列中,其中字段代表其属性,例如年龄和体重。

  • 使用Lombok使用Eclipse/Maven生成代码。希望能够在文本中查看正在生成的类。在目标下四处搜寻,但什么也没看到。有没有办法让Lombok输出生成的类?

  • 请建议应用继承时如何使用。 我有一个抽象类和具体的。应该是不可变的。将放在两者上会导致两个错误: null 我很乐意删除并使用构建器方法,但我正在重构一个公共库(试图优化模型类),我不希望在我的客户端上出现编译错误。 我还发现了解释第二个错误的这个问题。但其意图的逻辑并不清楚https://github.com/rzwitserloot/lombok/issues/945

  • 我有两个类,其中父类在构建时需要来自子类的一些属性。有没有一种方法可以使用lombok构建器来支持这一点? Parent.java 小孩JAVA 上面的编译失败,并显示消息 错误:无法从静态上下文@SuperBuilder引用非静态方法getRequest estType()