首页 > 解决方案 > 基类中的@Builder.Default 不起作用?

问题描述

我正在编写带有 lombok 注释的类并且遇到了一个问题:

@AllArgsConstructor
@Data
public abstract class Base {
    protected static final int a = 1;
    @Builder.default
    protected int b = 1;
}

public static class Sub extends Base {
    @Builder
    Sub(final int b, final int c) {
        super(b);
        this.c = c;
    }
    private int c;
}

当我尝试构建这样的子类时,@Builder.default 不起作用:

Sub.builder()
   .c(100)

b 应该是默认值 1,但实际上它是 null。

我发现了一些可能与我有关的案例。似乎 super() 与@Builder.Default 不兼容。我仍然不知道如何使 b 不为空。任何人都可以帮忙吗?谢谢!

标签: javabuilderlombok

解决方案


@Builder不能很好地处理继承,因为像 Lombok 这样的注释处理器可以做的有技术限制。由于这些限制,Lombok 无法在参数名称和超类中的字段名称之间建立联系。(而且在概念上也很难做到这一点,因为您可以以不同的方式命名参数,然后您必须进行一些更深入的代码分析。)

如果您可以使用实验性功能,您可以@SuperBuilder尝试一下。在两个类上添加它,并删除手动构造函数。(请注意,@SuperBuilderIntelliJ 尚不支持。)

另一种方法是在超类中使用手动构造函数并在那里设置默认值。


推荐阅读