Lombok @Wither、@Value、@NoArgsConstructor、@AllArgsConstructor 不能一起工作
Lombok @Wither, @Value, @NoArgsConstructor, @AllArgsConstructor do not work together
我正在写一个简单的模型如下。我可以在 intellij 结构视图中看到凋零函数。但是编译器抱怨 "variable field1 might not have been initialized"
@Wither
@Value
@NoArgsConstructor
@AllArgsConstructor
public class MyModel {
String field1;
String field2;
}
如果我初始化字段,我就看不到凋零函数了。这里会发生什么?
从 documentation 开始:
@Value
是 @Data
的不可变变体;默认情况下,所有字段都是私有的和最终的,并且不会生成设置器。
因此 String field1
变为 final String field1
。
因为你也在使用 @NoArgsConstructor
Java 编译器抱怨 "variable field1 might not have been initialized",这是真的,因为在代码的某个地方你可以做
MyModel model = new MyModel();
并且由于构造函数没有初始化任何字段,Java 抱怨。
来自 Final (Java) 维基:
final 变量只能通过初始化程序或赋值语句初始化一次。它不需要在声明时初始化:这称为 "blank final" 变量。 class 的空白最终实例变量必须在声明它的 class 的每个构造函数中明确分配;同样,必须在声明它的 class 的静态初始值设定项中明确分配空白最终静态变量;否则,两种情况都会出现 compile-time 错误。
这正是你的情况。
你可以用@Data
代替@Value
,其他部分都是一样的。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyModel {
String field1;
String field2;
}
我正在写一个简单的模型如下。我可以在 intellij 结构视图中看到凋零函数。但是编译器抱怨 "variable field1 might not have been initialized"
@Wither
@Value
@NoArgsConstructor
@AllArgsConstructor
public class MyModel {
String field1;
String field2;
}
如果我初始化字段,我就看不到凋零函数了。这里会发生什么?
从 documentation 开始:
@Value
是 @Data
的不可变变体;默认情况下,所有字段都是私有的和最终的,并且不会生成设置器。
因此 String field1
变为 final String field1
。
因为你也在使用 @NoArgsConstructor
Java 编译器抱怨 "variable field1 might not have been initialized",这是真的,因为在代码的某个地方你可以做
MyModel model = new MyModel();
并且由于构造函数没有初始化任何字段,Java 抱怨。
来自 Final (Java) 维基:
final 变量只能通过初始化程序或赋值语句初始化一次。它不需要在声明时初始化:这称为 "blank final" 变量。 class 的空白最终实例变量必须在声明它的 class 的每个构造函数中明确分配;同样,必须在声明它的 class 的静态初始值设定项中明确分配空白最终静态变量;否则,两种情况都会出现 compile-time 错误。
这正是你的情况。
你可以用@Data
代替@Value
,其他部分都是一样的。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyModel {
String field1;
String field2;
}