Lombok中的构造函数特性

3
如果我有一个包含三个实例变量和一个实例final变量的类。
那么我使用无参构造函数创建该类的实例时会受到限制吗?
public @Data class Employee {

    private Integer empId;

    private String empName;

    private Country country;

    private final Integer var;

}

尝试编译以下代码行时:
Employee emp = new Employee();

然后,我遇到了这个错误

需要与Employee(Integer)匹配的参数。

4个回答

4

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

因此,在这种情况下,您不能使用lombok来进行构造函数,您需要先初始化您的final变量。

private final Integer var = someValue;

3

您的变量var是final的。移除final关键字,使得var引用可以被重新赋值。


1
最终字段可以是可变的。 - xenteros

2

是的,它将限制使用无参数构造函数,除非您初始化最终变量。如果您初始化了最终变量,则允许使用默认的无参数构造函数创建该类的实例。但不会为该最终变量生成setter,但会生成getter。 即使我们使用@NoArgsConstructor,它也会抛出编译器错误,指出“最终变量可能未被初始化”。


2

简答

是的,通过无参构造方法创建该类的实例受到限制。

详细回答

@Data文档中可以看到:

@Data是一个方便的快捷注解,将@ToString@EqualsAndHashCode@Getter / @Setter@RequiredArgsConstructor这些特性捆绑在一起。

@RequiredArgsConstructor的作用如下:

@RequiredArgsConstructor为每个需要特殊处理的字段生成1个参数的构造函数。所有未初始化的final字段都会有一个参数,以及任何标记为@NonNull且未在声明时初始化的字段。

正如您所知道的那样,如果您已经定义了自己的构造函数,则Java不会生成默认的无参构造函数,并且使用Lombok的@Data注解后,您已经定义了自己的构造函数。

但您可以显式地添加Lombok的@NoArgsConstructor,如下:

@NoArgsConstructor将生成一个无参构造函数。如果这不可能(由于final字段),则会导致编译器错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接