【问题标题】:To have lombok @Value, @NoArgsConstructor, @AllArgsConstructor together将 lombok @Value、@NoArgsConstructor、@AllArgsConstructor 放在一起
【发布时间】:2020-06-10 09:36:47
【问题描述】:

我在一个类上使用 lombok 注释:

@Value
@NoArgsConstructor
@AllArgsConstructor
public class TestClass implements Serializable {

    private String x;
    private String y;
    private String z;

}

我需要@Value,因为我希望字段是不可变的,而构造函数注释作为我正在使用的 ORM 框架既需要无参数构造函数,也需要用于初始化字段的构造函数。

但是 IntelliJ 将此标记为错误,说明字段需要初始化,而我们有一个由 lombok 定义的 noarg 构造函数。

如何解决这个问题?

【问题讨论】:

  • 你不能有一个带有无参数构造函数的最终字段的值类,因为你不能设置字段。
  • 您可以通过反射或更合理地在无参数构造函数中设置它们。

标签: intellij-idea lombok


【解决方案1】:

使用@Value,lombok 将所有字段标记为final,如果没有默认值,@NoArgsConstructor 将导致字段从未初始化,这就是 IntelliJ 抱怨的原因。

你可以配置龙目岛

lombok.noArgsConstructor.extraPrivate=true

因此,@NoArgsConstructor 将生成具有默认值的承包商。可以使用@FieldDefaults设置默认值。

查看文档: @Value @FieldDefaults

【讨论】:

  • 也可以使用@NoArgsConstructor(force = true),它“将所有最终字段初始化为0 / null / false”
【解决方案2】:

为什么不用你想要的默认值来定义无参数构造函数?

@Value
@AllArgsConstructor
public class TestClass implements Serializable {

    private String x;
    private String y;
    private String z;

    TestClass() {
        x = "";
        y = "";
        z = "";
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 2021-09-19
    • 2019-06-17
    相关资源
    最近更新 更多