Groovy和final属性如何用Map设置?

时间:2011-10-12 09:44:37

标签: grails groovy

我正在尝试在Groovy源代码中设置最终属性(在Grails项目中使用)并遵循一些示例,但不知何故我似乎无法工作,我无法找到原因..

class Foo {

  final x

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

def foo = new Foo(x:1)

我收到错误:

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

根据互联网上发现的一些帖子,这应该有效。 为什么失败怎么能在使用最终字段时通过地图设置属性?

2 个答案:

答案 0 :(得分:8)

您可以使用@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

答案 1 :(得分:2)

我不知道为什么带有Map参数的构造函数不起作用,但是这个构造函数执行:

class Foo {

  final x

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

def foo = new Foo(1)