2011-10-12 89 views
2

我想设置在Groovy源(在Grails项目使用)和下面一些例子最终性能,但不知何故,我似乎并没有工作,我不能找出为什么..Groovy和最终属性如何使用Map设置?

class Foo { 

    final x 

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

def foo = new Foo(x:1) 

我收到错误:

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

据互联网这应该工作中发现一些帖子。 为什么在使用最终字段时如何通过地图设置属性?

回答

7

您可以实现您的目标是使用@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 
+0

感谢您的建议,我使用它的权利吧!非常感谢! – Marco

2

我不知道为什么有地图参数构造函数是不行的,但是这个构造函数:

class Foo { 

    final x 

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

def foo = new Foo(1)