java - groovy 和 lombok @Value 中的命名参数构造函数
问题描述
我有以下@Value
从 Lombok 注释的对象:
@Value
public class Foo {
private final boolean bar;
private final boolean baz;
private final boolean boo;
}
我尝试Foo
从 groovy 测试中实例化:
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 '()'
这是因为您的类中的所有字段都是最终字段,因此您必须在对象初始化期间启动这些字段。
因此,创建此类对象的唯一方法是使用全参数构造函数:
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)
推荐阅读
- c# - 如何检测 lambda 函数结果中的重复项?
- python - 使用 Python OpenCV 在图像路径(中文、日文、韩文)中读取/加载带有 unicode 字符的图像
- c - 具有字长模数的 PC 上的蒙哥马利乘法。这值得么?
- excel - 查找工作簿名称
- oracle - 谁能帮我解决下面提到的错误?
- powershell - 环境变量在路径中时的Powershell错误
- java - Firestore - Android Java - 事务
- c# - 控制器操作方法中没有异步/等待的任务
- android - 如何在flutter中从firebase数据填充listview
- http - 在chrome中使用EventSource时如何获取状态码?