龙目岛的构造函数功能

时间:2017-08-08 09:29:57

标签: java spring lombok

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

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

public @Data class Employee {

    private Integer empId;

    private String empName;

    private Country country;

    private final Integer var;

}

尝试编译以下行时

Employee emp = new Employee();

然后,我收到了这个错误

  

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

3 个答案:

答案 0 :(得分:3)

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

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

private final Integer var = someValue;

答案 1 :(得分:2)

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

答案 2 :(得分:1)

简短回答

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

答案很长

来自documentation for @Data

  

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

@RequiredArgsConstructor is

  

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

正如您应该知道的,如果您已经定义了自己的构造函数,Java不会生成默认的无参数构造函数 - 并且通过使用Lombok的create table #t (id int identity(1,1),Tos varchar(10) not null ,Froms varchar(10) not null,Rules varchar(10)) insert into #t VALUES ('01','02','E'),('01','03','E') ,('01','04','E'),('02','03','E') ,('02','01','E'),('03','02','E') ,('04','01','E') ; WITH CTE AS ( SELECT t.* ,c.id id1 FROM #t t CROSS APPLY ( SELECT * FROM #t c WHERE c.id > t.id AND c.tos = t.froms AND c.Froms = t.Tos ) c ) ,CTE1 AS ( SELECT t.* FROM #t t WHERE NOT EXISTS ( SELECT * FROM cte c WHERE c.id = t.id OR c.id1 = t.id ) ) SELECT tos ,froms ,rules FROM cte UNION ALL SELECT tos ,froms ,rules FROM cte1 DROP TABLE #t 注释,您可以使用。

您可以明确添加Lombok的@Data,但是:

  

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