2015-12-09 48 views
4

鉴于如何在@Immutable类中设置超类属性?

import groovy.transform.Immutable 

class A { 
    String a 
} 

@Immutable 
class B extends A { 
    String b 
} 

当我尝试使用的地图构造

def b = new B(a: "a", b: "b") 

然后a IST还是空设定值:

groovy:000> b = new B(a: "a", b: "b") 
===> B(b) 
groovy:000> b.b 
===> b 
groovy:000> b.a 
===> null 

是否有可能定义一个@Immutable类在地图构造函数中考虑它的超类的属性?

基于对ImmutableASTTransformation的代码,我使用Groovy 2.4.3

回答

3

,由createConstructorMapCommon方法添加的地图参数的构造函数不包括在此方法体内super(args)通话。

我不确定这种疏忽是故意的还是偶然的;无论如何,这个类将需要修改,以实现你正在寻找的东西。同时,我唯一的建议是使用组合而不是继承@Delegate来简化对A属性的访问。

import groovy.transform.* 

@TupleConstructor 
class A { 
    String a 
} 

@Immutable(knownImmutableClasses=[A]) 
class B { 
    @Delegate A base 
    String b 
} 

def b = new B(base: new A("a"), b: "b") 
println b.a 

然而,由于A是可变的(即使我们宣布它在@Immutable注释不变,B变得可变的,太,例如

b.a = 'foo' // succeeds