Inheritance 如何在@Immutable类中设置超类属性?
给定 当我尝试使用映射构造函数设置值时Inheritance 如何在@Immutable类中设置超类属性?,inheritance,groovy,immutability,Inheritance,Groovy,Immutability,给定 当我尝试使用映射构造函数设置值时 import groovy.transform.Immutable class A { String a } @Immutable class B extends A { String b } 然后aist仍然为空: def b = new B(a: "a", b: "b") 是否可以定义一个@Immutable类,该类在映射构造函数中考虑其超类的属性 我正在使用Groovy 2.4.3,基于的代码,createConstructorMap
import groovy.transform.Immutable
class A {
String a
}
@Immutable
class B extends A {
String b
}
然后a
ist仍然为空:
def b = new B(a: "a", b: "b")
是否可以定义一个@Immutable
类,该类在映射构造函数中考虑其超类的属性
我正在使用Groovy 2.4.3,基于的代码,createConstructorMapCommon
方法添加的Map arg构造函数在方法体中不包含对super(args)
的调用
我不确定这种疏忽是故意的还是偶然的;无论如何,这个类需要修改才能实现您想要的。同时,我唯一的建议是使用组合而不是继承@Delegate
,以简化对A
属性的访问
groovy:000> b = new B(a: "a", b: "b")
===> B(b)
groovy:000> b.b
===> b
groovy:000> b.a
===> null
然而,由于A
是可变的(即使我们在@immutable
注释中声明它不可变,B
也变为可变的,例如
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
我也遇到过这个问题,您可以通过调用groovy自动添加的getter方法来绕过它,而不是直接访问属性(在您的示例中是b.getA()而不是b.a) 这里有一个愚蠢的例子
b.a = 'foo' // succeeds
看到它在行动吗
这并不总是一个理想的解决方案,但它是一个解决办法。问题是关于“映射构造函数”。在您的示例中没有出现这个问题。即使这样做有效,不同的返回值(property vs.getter)似乎也有相当大的问题。
class base{
def name;
def myNameIs(){
return name;//willl return null when called from extending class person
}
def extendersNameIs(){
return getName()// will return extending class default value
}
}
class person extends base{
def name="betty"//override set default value
}
def m=new person();
println m.myNameIs(); // outputs null
println m.extendersNameIs();//outputs "betty"