java - 具有复杂类结构的 Lombok 构建器继承

标签 java intellij-idea lombok intellij-lombok-plugin

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

我试图继承父构建器,同时也满足接口(interface),仅使用不可变字段。这是我的类结构:

代码

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;
}

“获胜条件”

我希望 Lombok

  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 needs a default constructor in the base class.

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

There is no default constructor available in base class.

因此,我从 AbstractFoo 中删除了 @SuperBuilder ,并添加了一个包含所有参数的手动创建的构造函数。错误仍然存​​在。我尝试过其他方法和注释组合,但没有任何效果。

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

最佳答案

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

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

关于java - 具有复杂类结构的 Lombok 构建器继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55895233/

相关文章:

java - 为什么要复制的 Bintray Maven 依赖项片段包含 <type>pom</type>

intellij-idea - 使用 JSX Harmony 时,如何让 WebStorm 调整结束标记的缩进以匹配其父级?

java - 独立 IntelliJ 解析器中的符号解析

gradle - AspectJ + Gradle + Lombok 不起作用

spring - lombok @Builder 类型转换错误

java - 如何将所有枚举值正确插入到哈希集中?

java - 如何缓存通过Ajax调用获取的通知数据?

java - 使用 javax 和 pdfbox 的静默打印机应用程序

java - 无法在 IntelliJ IDEA 中解析符号 "HttpServerFactory"

java - 使用构建器时无法执行自定义反序列化