给定的
import groovy.transform.Immutable
class A {
String a
}
@Immutable
class B extends A {
String b
}
当我尝试使用 map 构造函数设置值时
def b = new B(a: "a", b: "b")
然后
a
仍然为空:groovy:000> b = new B(a: "a", b: "b")
===> B(b)
groovy:000> b.b
===> b
groovy:000> b.a
===> null
是否可以定义
@Immutable
在 map 构造函数中考虑其父类(super class)属性的类?我正在使用 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
关于inheritance - 如何在@Immutable 类中设置父类(super class)属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34182736/