Именованный параметр конструктора в groovy и lombok @Value - PullRequest
4 голосов
/ 13 июня 2019

У меня есть следующий объект, помеченный @Value от Lombok:

@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 Ответ

3 голосов
/ 13 июня 2019
Constructor 'Foo' cannot be applied to '()'

Это происходит потому, что все поля в вашем классе являются окончательными, поэтому вы должны инициировать эти поля во время инициализации объекта.

Таким образом, единственный способ создать объект этого класса - это использовать всеКонструктор args:

new Foo(true, false, true)

Из-за того, что Groovy обрабатывает то, что выглядит как именованные аргументы (Groovy не поддерживает именованные аргументы - он передает карту), это также приведет к ошибке с аналогичнымиОтличный код.Groovy обрабатывает проходящую здесь карту, разворачивая карту в вызовы сеттера (а их нет, потому что атрибуты являются окончательными).

@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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...