java - groovy 和 lombok @Value 中的命名参数构造函数

标签 java groovy lombok

我在 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/

相关文章:

基于多个参数的Java数组排序

java - 玩! Intellij IDEA 中的 2.0 控制台将无法工作

maven - 无法使用 lombok 构建 maven jhipster 项目

java - 尝试读取 DTD 文件的非验证 DocumentBuilder

java - map 不接受子类

xml - 如何使用 groovy 脚本循环 XML 子节点

json - 我如何遍历一个包含对象列表的 json?

groovy - 我想念什么方法? project.apply插件上的MissingMethodException: 'customPlugin'

java - map 结构/ Lombok : No property named "customfields" exists in source parameter(s) as on Dec 31 2019

java - 忽略来自 @EqualsAndHashCode 的 HashCode - Lombok