我正在写一个简单的模型如下。我可以在intellij结构视图中看到wither函数。但编译器抱怨“变量field1可能尚未初始化”
@Wither
@Value
@NoArgsConstructor
@AllArgsConstructor
public class MyModel {
String field1;
String field2;
}
如果我初始化字段,我不再看到枯萎的功能了。这可能会发生什么?
答案 0 :(得分:2)
@Value
是@Data
的不可变变体;默认情况下,所有字段都是私有和最终字段,并且不会生成设置器。
因此String field1
变为final String field1
。
由于您还在使用@NoArgsConstructor
Java编译器抱怨“变量field1可能尚未初始化”,这是正确的,因为代码中的某处可以执行
MyModel model = new MyModel();
由于构造函数没有初始化任何字段,Java抱怨。
来自Final (Java) wiki:
最终变量只能通过初始值设定项或赋值语句初始化一次。它不需要在声明点初始化:这称为“空白最终”变量。必须在声明它的类的每个构造函数中明确赋值类的空白最终实例变量;类似地,必须在声明它的类的静态初始值设定项中明确赋值空白的最终静态变量;否则,两种情况都会发生编译时错误。
这正是你案件中发生的事情。
答案 1 :(得分:-1)
你可以用@Data
代替@Value
,其他部分都一样。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyModel {
String field1;
String field2;
}