Lombok @Wither、@Value、@NoArgsConstructor、@AllArgsConstructor 不能一起工作

Pra*_*jan 1 java lombok

我正在编写一个简单的模型,如下所示。我可以在intellij结构视图中看到wither函数。但编译器抱怨“变量 field1 可能尚未初始化”

@Wither
@Value
@NoArgsConstructor
@AllArgsConstructor
public class MyModel {
    String field1;
    String field2;
}
Run Code Online (Sandbox Code Playgroud)

如果我初始化这些字段,我就不会再看到凋零函数。这里可能发生什么?

Dam*_*vic 5

从文档来看:

@Value是 的不可变变体@Data;默认情况下,所有字段都是私有的和最终的,并且不会生成设置器。


于是就String field1变成了final String field1。

由于您也在使用@NoArgsConstructorJava 编译器抱怨“变量 field1 可能尚未初始化”,这是事实,因为您可以在代码中的某个位置执行以下操作

MyModel model = new MyModel();
Run Code Online (Sandbox Code Playgroud)

由于构造函数没有初始化任何字段,Java 会抱怨。

来自Final (Java) wiki:

最终变量只能通过初始化程序或赋值语句初始化一次。它不需要在声明时初始化:这称为“空白最终”变量。类的空白最终实例变量必须在声明它的类的每个构造函数中明确分配;类似地,空白的最终静态变量必须在声明它的类的静态初始值设定项中明确分配;否则,这两种情况都会出现编译时错误。


这正是您的情况所发生的情况。

  • 我想,lombok 应该支持这个用例。 (2认同)
  • 有时默认构造函数必须可用于反射,就像在 JPA 规范中一样,但您希望对象不可变(JPA 通过反射访问字段) (2认同)