当前位置 : 主页 > 手机开发 > 其它 >

继承 – 如何在@Immutable类中设置超类属性?

来源:互联网 收集:自由互联 发布时间:2021-06-19
特定 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
网友评论