【问题标题】:lombok @Data complains "lombok needs a default constructor in the base class", when abstract class having final field当抽象类具有最终字段时,lombok @Data 抱怨“lombok 在基类中需要一个默认构造函数”
【发布时间】:2019-09-04 21:08:23
【问题描述】:
@Data
public abstract class B {
   private final String str;
}

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

在intellij中A类的数据报错,但是代码可以通过命令行成功编译,不知道该怎么办

【问题讨论】:

    标签: java lombok intellij-plugin


    【解决方案1】:

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

    如果您需要可变数据,请删除 final 字段。对于不可变数据,将所有字段设为final 并使用@Value。有时,需要部分可变的数据,但我尽量避免它,因为它会造成混淆(有些字段可以设置,有些则不能),而且两者都有缺点。


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

    【讨论】:

      【解决方案2】:

      @Data 注解不添加默认构造函数。 尝试将@NoArgsConstructor 添加到您的基类B 以使用Lombok 生成默认构造函数。

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

      【讨论】:

      • 但@NoArgsConstructor 仍会搜索构造函数,但B 类是抽象的。还有为什么我用 cmd 编译好呢?
      • 也许在这个构造函数中初始化常量字段?或者这不是 IntelliJ 冷静下来的必要条件?
      • @Richard 这与编译器无关。它还将在 IntelliJ 中编译。但是如果你有一个未初始化的私有 final 字段,那么只能在它自己的类中设置一次。由于类本身是抽象的,因此您只能在默认构造函数中将其设置为 uprego 已经提到的。 (也许可以手动编写构造函数或直接在声明中初始化它)。否则,在使用 final 属性时会出现运行时异常,因为它从未被初始化。这对你有意义吗?
      【解决方案3】:

      这不会编译事件。在Intellij,当你不确定lombok代码有什么问题时,你可以打开你不确定的课程,继续Refactor -> Delombok -> All lombok annotations 你会看到什么龙目岛实际上是为你创造的。

      【讨论】:

      • 我遇到了类似的问题,尽管有 lombok 警告,Intellij 还是编译了它。
      猜你喜欢
      • 2017-06-26
      • 2019-06-17
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多