2015-12-09 50 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