覆盖groovy invokeMethod会导致java中的编译错误

时间:2017-01-20 13:31:24

标签: java groovy

方案: 我们有一些java构建器,用于为集成测试创建对象。构建器使用默认值创建有效的域对象。如果需要不同的值,可以更改它们。

Foo fooWithDefaultValue = new FooBuilder().build()
Foo fooWithChangedValue = new FooBuilder().withValue("someValue").build()

我们希望构建一种新类型的构建器,它可以创建一个对象并将其持久化。

Foo fooInDB = new FooDatabaseBuilder().withValue("dbValue").persist()

由于withValue方法与我们的旧构建器相同,我们希望重用旧构建器,而不是将代码复制到新构建器中,加上持久化方法。

我们的第一次尝试是groovy使用@Delegate从FooDbBuilder委托给FooBuilder。

class FooDatabaseBuilder {
    @Delegate
    private FooBuilder = new FooBuilder();

    public void persist(){
      // persist code here
   }
}

这适用于委托部分,但FooDatabaseBuilder.withValue()的返回值是FooBuilder,它破坏了流体方法。因此,我们更改了FooDatabaseBuilder的Metaclass中的invokeMethod以返回FooDatabaseBuilder。如果我们在groovy中使用那些构建器一切正常,但在java中我们有编译错误,因为java没有看到invokeMethod的变化。

我如何构建这样的dbBuilder,它可以像构建器一样使用其他方法来保存创建的对象?

0 个答案:

没有答案