父类

时间:2016-07-21 20:31:22

标签: groovy abstract-class immutability

我有两个不可变的groovy类,它们有一些我试图抽象到父类的共享值。但是,当我创建以下内容时,第二个测试用例总是失败。虽然一切都正确编译并且在运行时没有抛出错误,但是当我将构造函数赋给父属性int时,它永远不会被设置,从而产生空值。我还没有发现任何禁止这样做的文件,但我想知道这是否可能?我已经尝试了一些Annotations和类类型的配置(例如从父类中删除抽象)但似乎没有什么能够完全删除@Immutable标签。

abstract class TestParent {
       String parentProperty1
}

@ToString(includeNames = true)
@Immutable
class TestChild extends TestParent {
   String childProperty1
   String childProperty2
}


class TestCase {
    @Test
    void TestOne() {
        TestChild testChild = new TestChild(
                childProperty1: "childOne",
                childProperty2: "childTwo",
                parentProperty1: "parentOne"
        )

        assert testChild
        assert testChild.parentProperty1
    }
}

1 个答案:

答案 0 :(得分:2)

根据ImmutableASTTransformation的代码,createConstructorMapCommon方法添加的Map-arg构造函数不包含对方法体中super(args)的调用。

这意味着默认情况下不可变类是自包含的

现在,如果你想这样做,你需要使用组合而不是继承,这是你如何做到这一点的一个例子:

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")
assert b.a

我希望这会有所帮助:)