Groovy和Lombok @Value中的命名参数构造函数

时间:2019-06-13 08:14:36

标签: java groovy lombok

我有以下来自龙目岛的标有@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中使用命名构造函数,该方法将使用所有参数调用构造函数,而不是调用空构造函数,然后尝试设置字段?

1 个答案:

答案 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)