groovy 和 lombok @Value 中的命名参数构造函数
Named parameter constructor in groovy and lombok @Value
我在 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)
但我收到警告:
Constructor 'Foo' cannot be applied to '()'
并且在运行期间出现以下错误:
Cannot set readonly property: bar for a class: Foo
有没有一种方法可以在 groovy 中使用命名构造函数来调用带有所有参数的构造函数,而不是调用空构造函数然后尝试设置字段?
Constructor 'Foo' cannot be applied to '()'
出现这种情况是因为您的 class 中的所有字段都是最终字段,因此您必须在对象初始化期间启动这些字段。
所以创建这个 class 的对象的唯一方法是使用 all-args 构造函数:
new Foo(true, false, true)
由于这种方式,Groovy 处理看起来像命名参数的东西(Groovy 不 支持命名参数 - 它传递一个 Map),这也会因类似的 Groovy 代码而失败。 Groovy 处理传递到此处的地图的方式是将地图展开为 setter 调用(还有 none 因为属性是最终的)。
@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)
我在 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)
但我收到警告:
Constructor 'Foo' cannot be applied to '()'
并且在运行期间出现以下错误:
Cannot set readonly property: bar for a class: Foo
有没有一种方法可以在 groovy 中使用命名构造函数来调用带有所有参数的构造函数,而不是调用空构造函数然后尝试设置字段?
Constructor 'Foo' cannot be applied to '()'
出现这种情况是因为您的 class 中的所有字段都是最终字段,因此您必须在对象初始化期间启动这些字段。
所以创建这个 class 的对象的唯一方法是使用 all-args 构造函数:
new Foo(true, false, true)
由于这种方式,Groovy 处理看起来像命名参数的东西(Groovy 不 支持命名参数 - 它传递一个 Map),这也会因类似的 Groovy 代码而失败。 Groovy 处理传递到此处的地图的方式是将地图展开为 setter 调用(还有 none 因为属性是最终的)。
@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)