如果我有一个包含三个实例变量和一个实例最终变量的类。
我是否会限制使用无参数构造函数创建该类的实例?
public @Data class Employee {
private Integer empId;
private String empName;
private Country country;
private final Integer var;
}
尝试编译以下行时
Employee emp = new Employee();
然后,我收到了这个错误
需要参数来匹配Employee(Integer)。
答案 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)
简短回答
是,您无法使用无参数构造函数创建该类的实例。
答案很长
@Data是一个方便的快捷方式注释,它捆绑了特征 @ToString,@ EqualsAndHashCode,@ Getter / @Setter和 @RequiredArgsConstructor 一起
@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将生成一个没有参数的构造函数。 如果 这是不可能的(因为最终字段),编译器错误会 结果