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"