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 实际为你创造了什么。
@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 实际为你创造了什么。