访问groovy getter而不是推迟到@Delegate

鉴于这段代码:

class Foo {
  @Delegate Map data

  Foo(data) { this.data = data }

  def getBar() { "Bar" }
}

new Foo([:]).bar // null
new Foo([:]).getBar() // "Bar"

似乎代表在转换为对getter的调用之前拦截了对.bar的调用.有没有办法解决?我想有一个代表到地图,但仍然可以使用呼叫站点上的清洁.bar来引用该属性.

最佳答案 你得到的东西比你真正想要的更多(从地图处理物业 – 至少这是我的猜测).直到有人找到解决这个问题的方法(排除在@Delegate上对我不起作用)你可能会因为使用expando而变得更好:

@groovy.transform.InheritConstructors
class Foo extends Expando {
    def getBar() { "Bar" }
}

def f = new Foo(baz:'baz')
assert f.foo==null
assert f.bar=="Bar"
assert f.getBar()=="Bar"
f.foo="F00"
assert f.foo=="F00"
assert f.baz=="baz"
点赞