Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Lombok@Wither、@Value、@noargsconstuctor、@allargsconstuctor不能一起工作_Java_Lombok - Fatal编程技术网

Java Lombok@Wither、@Value、@noargsconstuctor、@allargsconstuctor不能一起工作

Java Lombok@Wither、@Value、@noargsconstuctor、@allargsconstuctor不能一起工作,java,lombok,Java,Lombok,我正在写一个简单的模型,如下所示。我可以在intellij结构视图中看到wither函数。但编译器抱怨“变量field1可能尚未初始化” 如果我初始化字段,我就看不到wither函数了。这里会发生什么?从以下位置开始: @Value是@Data的不可变变量;默认情况下,所有字段都是私有的和最终的,并且不会生成setter 所以字符串字段1变成了最终字符串字段1 由于您也在使用@noargsconstuctorJava编译器抱怨“variable field1可能尚未初始化”,这是正确的,因为在

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

如果我初始化字段,我就看不到wither函数了。这里会发生什么?

从以下位置开始:

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


所以
字符串字段1
变成了
最终字符串字段1

由于您也在使用
@noargsconstuctor
Java编译器抱怨“variable field1可能尚未初始化”,这是正确的,因为在代码中的某个地方您可以这样做

MyModel model = new MyModel();
由于构造函数没有初始化任何字段,Java会抱怨

从维基:

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



这正是您的情况。

您可以使用
@Data
而不是
@Value
,所有其他部分都是相同的

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyModel {
    String field1;
    String field2;
}

我想,lombok应该支持这个用例。@PrabhatRanjan如何支持?不可变对象的所有字段都必须是不可变的,即在构造期间分配。因此
@Value
@noargsconstuctor
是互斥的(除了没有字段的类)。最好的办法是为这个组合提供一条专门的错误消息。@maaartinus我想到了一个特殊的实现:public MyModel(){this(null,null)}@PrabhatRanjan但是这样一个只有null的不可变对象在大多数情况下不是没有用处吗?当涉及字符串时,您更喜欢使用
,类似于集合。。。总而言之,这项功能的每种变体在全世界可能有10种用途有时,默认构造函数必须可用于反射,如JPA规范中,但您希望对象不可变(JPA通过反射访问字段)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyModel {
    String field1;
    String field2;
}