java - 基类中的@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 不为空。任何人都可以帮忙吗?谢谢!
解决方案
@Builder
不能很好地处理继承,因为像 Lombok 这样的注释处理器可以做的有技术限制。由于这些限制,Lombok 无法在参数名称和超类中的字段名称之间建立联系。(而且在概念上也很难做到这一点,因为您可以以不同的方式命名参数,然后您必须进行一些更深入的代码分析。)
如果您可以使用实验性功能,您可以@SuperBuilder
尝试一下。在两个类上添加它,并删除手动构造函数。(请注意,@SuperBuilder
IntelliJ 尚不支持。)
另一种方法是在超类中使用手动构造函数并在那里设置默认值。
推荐阅读
- python - 使用 Python Beautifulsoup 抓取表格和数据
- python - 如何在 pyspark 上使用多个内核(来自 python 脚本)
- python - 用BS4刮,找到公司名称和ID
- html - 当一行中的一个 div 被隐藏时,平滑地缩小间隙
- java - 使用java8使用联合两个数据框时如何获取空值列
- testing - TestCafe:指定选择器的问题:跨度抓取文本
- windows - 库的 CMake 生成 DLL。应用程序的 CMake 需要 LIB
- php - 为什么 strpos 第一次工作,但不是第二次?
- sql - 汇总表 sql 中每个不同日期的数量列
- java - Java,映射一个列表并在一行中进行包含检查还是遍历整个列表?