inheritance - 如何在@Immutable 类中设置父类(super class)属性?

标签 inheritance groovy immutability

给定的

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/

相关文章:

spring-boot - Spring Cloud Contract - 查询参数契约(Contract)始终与同一契约(Contract)匹配

groovy - 如何在 Groovy 中复制文件

events - 使用Spring Security Core插件和Grails 2.0.0注册事件监听器时出错

java - 以流畅的风格将项目添加到不可变对象(immutable对象)的命名方法

具有父类的常规不可变对象(immutable对象)

java - 调用 java.lang.String 不可变是否正确?

java - 如何覆盖在另一个已继承的类中赋值的变量

maven-2 - Maven 站点插件 : How does menu inheritance work?

php - OOP 方法链接可选返回

C++ 保护 : fail to access base's protected member from within derived class