Java groovy和lombok@Value中的命名参数构造函数
我用Lombok的Java groovy和lombok@Value中的命名参数构造函数,java,groovy,lombok,Java,Groovy,Lombok,我用Lombok的@Value注释了以下对象: @Value public class Foo { private final boolean bar; private final boolean baz; private final boolean boo; } 我尝试从groovy测试中实例化Foo: new Foo(bar: true, baz: false, boo: true) 但我得到警告: 构造函数“Foo”不能应用于“()” 并且在运行时出现以下错误:
@Value
注释了以下对象:
@Value
public class Foo {
private final boolean bar;
private final boolean baz;
private final boolean boo;
}
我尝试从groovy测试中实例化Foo
:
new Foo(bar: true, baz: false, boo: true)
但我得到警告:
构造函数“Foo”不能应用于“()”
并且在运行时出现以下错误:
无法为class:Foo设置只读属性:bar
有没有一种方法可以在groovy中使用命名构造函数来调用所有参数的构造函数,而不是调用空构造函数然后尝试设置字段
Constructor 'Foo' cannot be applied to '()'
出现这种情况是因为类中的所有字段都是最终字段,因此必须在对象初始化期间初始化这些字段
因此,创建此类对象的唯一方法是使用所有args构造函数:
new Foo(true, false, true)
由于这种方式,Groovy处理类似命名参数的内容(Groovy不支持命名参数-它传递一个映射),对于类似的Groovy代码,这也会失败。Groovy处理传递到这里的映射的方式是将映射展开到setter调用中(因为属性是final,所以没有)
失败于
Caught: groovy.lang.ReadOnlyPropertyException: Cannot set readonly property: bar for class: Foo
groovy.lang.ReadOnlyPropertyException: Cannot set readonly property: bar for class: Foo
at x.run(x.groovy:8)
你的
Foo
类是否有no-arg-c'tor?Groovy编译def=newfoo(bar:baz)
的方式基本上是def=newfoo();f、 bar=baz
(groovy中没有命名参数,它只是传递一个映射)groovy有内置注释,您应该使用它来创建构造函数。
Caught: groovy.lang.ReadOnlyPropertyException: Cannot set readonly property: bar for class: Foo
groovy.lang.ReadOnlyPropertyException: Cannot set readonly property: bar for class: Foo
at x.run(x.groovy:8)