Groovy и окончательные свойства, как установить с картой? - PullRequest
3 голосов
/ 12 октября 2011

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

class Foo {

  final x

  Foo(Map m=[:]) {
    m.each { key, value -> this.@"$key" = value }
  }
}

def foo = new Foo(x:1)

Iполучаю ошибку:

Cannot set the property 'x' because the backing field is final.

Согласно некоторым сообщениям, найденным в Интернете, это должно работать.Почему не получается, как можно установить свойства через карту при использовании последнего поля?

Ответы [ 2 ]

8 голосов
/ 12 октября 2011

Вы можете достичь желаемого результата с помощью аннотации @Immutable

@Immutable
class Foo {
  def x
}

Тогда это можно назвать

def foo = new Foo([:])

или

def foo = new Foo(x:42)

и позже

foo.x = 43

причины

ERROR groovy.lang.ReadOnlyPropertyException:
Cannot set readonly property: y for class: Foo
2 голосов
/ 12 октября 2011

Я не знаю, почему ваш конструктор с аргументом Map не работает, но этот конструктор работает:

class Foo {

  final x

  Foo(x) {
    this.x = x
  }
}

def foo = new Foo(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...