lombok @Data 抱怨 "lombok needs a default constructor in the base class",当抽象 class 具有最终字段时

lombok @Data complains "lombok needs a default constructor in the base class", when abstract class having final field

@Data
public abstract class B {
   private final String str;
}

@Data
public class A extends B{
   private final String s;
}

关于 class 的数据在 intellij 中抱怨,但代码可以通过命令行成功编译,不知道该怎么做

@Data 注解没有添加默认构造函数。 尝试将 @NoArgsConstructor 添加到您的 Base Class B 以使用 Lombok 生成默认构造函数。

您还可以阅读 @Data 的实际含义 here

一个问题是 @Data 用于可变数据,而您的 classes 中没有任何可变数据。所以使用 @Data 是完全错误的......它是否编译并不重要。

如果您需要可变数据,请删除 final 字段。对于不可变数据,使所有字段 final 并使用 @Value。有时,需要部分可变的数据,但我尽量避免它,因为它很混乱(有些字段可以设置,有些不能)并且它们提供了两者的缺点。


另一个问题是 Lombok 无法访问 class 层次结构。由于 B 有一个 final 字段,您需要在构造函数中对其进行初始化,这意味着 A 的构造函数必须调用非默认构造函数。这对龙目岛来说是不可能的。 Lombok 中有 @Superbuilder,这是 Lombok 唯一能够很好地处理 class 层次结构的功能。

这不会编译。在Intellij中,当你不确定lombok代码有什么问题时,可以打开你不确定的class,继续Refactor -> Delombok -> All lombok annotations 你会看到 lombok 实际为你创造了什么。