我有以下来自龙目岛的标有@Value
的对象:
@Value
public class Foo {
private final boolean bar;
private final boolean baz;
private final boolean boo;
}
我尝试从常规测试中实例化Foo
:
new Foo(bar: true, baz: false, boo: true)
但我得到警告:
Constructor 'Foo' cannot be applied to '()'
,并在运行时出现以下错误:
Cannot set readonly property: bar for a class: Foo
是否可以在groovy中使用命名构造函数,该方法将使用所有参数调用构造函数,而不是调用空构造函数,然后尝试设置字段?
答案 0 :(得分:3)
Constructor 'Foo' cannot be applied to '()'
出现这是因为类中的所有字段都是最终字段,因此您必须在对象初始化期间初始化这些字段。
因此创建此类的对象的唯一方法是使用all-args构造函数:
new Foo(true, false, true)
由于这种方式,Groovy处理了看起来像命名参数的东西(Groovy 不不支持命名参数-它传递了Map),这也会因类似的Groovy代码而失败。 Groovy处理通过此处的地图的方式是将地图展开为setter调用(并且没有,因为属性是最终属性)。
@groovy.transform.TupleConstructor
class Foo {
final boolean bar
final boolean baz
final boolean boo
}
new Foo(bar: true, baz: false, boo: true)
失败
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)