Ber*_*ium 5 groovy inheritance immutability
给定的
import groovy.transform.Immutable
class A {
String a
}
@Immutable
class B extends A {
String b
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用地图构造函数设置值时
def b = new B(a: "a", b: "b")
Run Code Online (Sandbox Code Playgroud)
那么它a仍然为空:
groovy:000> b = new B(a: "a", b: "b")
===> B(b)
groovy:000> b.b
===> b
groovy:000> b.a
===> null
Run Code Online (Sandbox Code Playgroud)
是否可以定义一个 @Immutable在地图构造函数中考虑其超类属性的类?
我正在使用 Groovy 2.4.3
根据ImmutableASTTransformation的代码,该方法添加的 Map-arg 构造函数不包含对方法主体中的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
Run Code Online (Sandbox Code Playgroud)
然而,sinceA是可变的(即使我们在@Immutable注释中声明它不可变,B它也变得可变,例如
b.a = 'foo' // succeeds
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
817 次 |
| 最近记录: |