我在 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”不能应用于“()”
并且在运行时出现以下错误:
无法为类 Foo 设置只读属性:bar
有没有一种方法可以在 groovy 中使用命名构造函数来调用带有所有参数的构造函数,而不是调用空构造函数然后尝试设置字段?
最佳答案
Constructor 'Foo' cannot be applied to '()'
出现这个是因为你类中的所有字段都是final的,所以你必须在对象初始化时初始化这些字段。
因此创建此类对象的唯一方法是使用全参数构造函数:
new Foo(true, false, true)
由于这种方式,Groovy 处理看起来像命名参数的东西(Groovy 不 支持命名参数 - 它传递一个 Map),这也会因类似的 Groovy 代码而失败。 Groovy 处理传递到这里的 map 的方式是将 map 展开到 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)
关于java - groovy 和 lombok @Value 中的命名参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56576173/