首页 > 解决方案 > 具有复杂类结构的 Lombok 构建器继承

问题描述

我已经阅读了有关 lombok 的构建器和继承的其他问题,但没有一个解决方案有效。使用 Lombok 版本 1.18.4 和 Java 11。

我试图继承父构建器,同时也满足接口,只使用不可变字段。这是我的班级结构:

编码

public interface FooInterface {
    String getFoo();
}

getFoo逻辑在所有实现中都非常普遍,因此我决定创建一个Abstract帮助程序来避免在任何地方复制粘贴相同的代码。

@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 在基类中需要一个默认构造函数。

@Data如果我从中删除,FooTest则会收到此错误:

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

所以我删除了@SuperBuilderfromAbstractFoo并添加了一个带有所有参数的手动创建的构造函数。错误仍然存​​在。我尝试过其他的东西和注释组合,但没有一个奏效。

我还尝试 - 徒劳地 - 将所有AbstractFoo字段设置为protected final,并自行声明 Foo 实现final,这符合我的业务规则。

标签: javaintellij-idealombokintellij-lombok-plugin

解决方案


@SuperBuilder当前版本的 IntelliJ IDEA 插件尚不支持。

项目的 Github 跟踪器上有一个未解决的问题 - 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 版本,如果它不起作用,请等待下一个版本。


推荐阅读