Java groovy和lombok@Value中的命名参数构造函数

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”不能应用于“()” 并且在运行时出现以下错误:

我用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”不能应用于“()”

并且在运行时出现以下错误:

无法为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)