【问题标题】:Constructors features in LombokLombok 中的构造函数功能
【发布时间】:2017-08-08 09:29:57
【问题描述】:

如果我有一个包含三个实例变量和一个实例最终变量的类。

是否会限制我使用无参数构造函数创建该类的实例?

public @Data class Employee {

    private Integer empId;

    private String empName;

    private Country country;

    private final Integer var;

}

当试图编译以下行时

Employee emp = new Employee();

然后,我得到了这个错误

需要参数来匹配 Employee(Integer)。

【问题讨论】:

    标签: java spring lombok


    【解决方案1】:

    您的Integer var 是最终的。您只能在构造函数或初始化程序中设置最终变量。

    所以在这种情况下,你不能使用 lombok 来构造构造函数,你需要先初始化你的 final 变量

    private final Integer var = someValue;
    

    【讨论】:

      【解决方案2】:

      您的变量var 是最终变量。删除final,以允许var 引用可重新分配。

      【讨论】:

      • 最终字段可以是可变的
      【解决方案3】:

      是的,它将限制使用无参数构造函数,除非您初始化最终变量。如果您初始化最终变量,它将允许使用默认的无参数构造函数创建该类的实例。但是不会为最终变量生成setter,但是会生成getter。 即使我们使用@NoArgsConstructor,它也会抛出编译器错误声明, final variable may not be initialized.

      【讨论】:

        【解决方案4】:

        简短回答

        是的,您不能使用无参数构造函数创建该类的实例。

        长答案

        来自documentation for @Data

        @Data 是一个方便的快捷注解,它捆绑了 @ToString、@EqualsAndHashCode、@Getter / @Setter 和 @RequiredArgsConstructor 一起

        @RequiredArgsConstructor is:

        @RequiredArgsConstructor 生成一个带有 1 个参数的构造函数 每个需要特殊处理的字段。 所有未初始化的final fields 获取参数,以及任何标记为的字段 @NonNull 未在声明它们的位置初始化。

        您应该知道,如果您已经定义了自己的构造函数,Java 不会生成默认的无参数构造函数 - 并且通过使用 Lombok 的 @Data 注释,您就拥有了。

        您可以显式添加 Lombok 的 @NoArgsConstructor,但是:

        @NoArgsConstructor 将生成一个没有参数的构造函数。 如果 这是不可能的(因为最终字段),编译器错误将 结果

        【讨论】:

          猜你喜欢
          • 2020-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-14
          • 2011-04-21
          • 1970-01-01
          • 2019-01-03
          • 2016-03-18
          相关资源
          最近更新 更多