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

时间:2014-11-12 21:21:14

标签: groovy delegates annotations javabeans abstract-syntax-tree

鉴于这段代码:

class Foo {
  @Delegate Map data

  Foo(data) { this.data = data }

  def getBar() { "Bar" }
}

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

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

2 个答案:

答案 0 :(得分:2)

你得到的东西比你真正想要的更多(从地图处理物业 - 至少这是我的猜测)。在有人找到解决此问题的方法之前(excludes上的@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"

答案 1 :(得分:0)

好的,cludgy解决方案,但改变构造函数从给定的地图创建一个defaultMap来调用getter作为后备似乎给了我想要的东西

class Foo {
  @Delegate Map data

  Foo(data) { this.data = data.withDefault { "get${it.capitalize()}"() } }

  def getBar() { "got bar" }
}

这样做的缺点是,在地图有一个带有键'bar'的条目的情况下,仍然更喜欢地图。仍然希望有人有更好的解决方案。