特定 import groovy.transform.Immutableclass A { String a}@Immutableclass B extends A { String b} 当我尝试使用map构造函数设置值时 def b = new B(a: "a", b: "b") 然后一个ist仍为null: groovy:000 b = new B(a: "a", b: "b")
import groovy.transform.Immutable class A { String a } @Immutable class B extends A { String b }
当我尝试使用map构造函数设置值时
def b = new B(a: "a", b: "b")
然后一个ist仍为null:
groovy:000> b = new B(a: "a", b: "b") ===> B(b) groovy:000> b.b ===> b groovy:000> b.a ===> null
是否可以定义一个@Immutable类,该类在地图构造函数中考虑其超类的属性?
我正在使用Groovy 2.4.3
根据 ImmutableASTTransformation的代码,createConstructorMapCommon方法添加的Map-arg构造函数不包括对方法体中的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