鉴于这段代码:
class Foo {
@Delegate Map data
Foo(data) { this.data = data }
def getBar() { "Bar" }
}
new Foo([:]).bar // null
new Foo([:]).getBar() // "Bar"
似乎委托在转换为对getter的调用之前拦截了对.bar
的调用。有没有办法解决?我想有一个代表到地图,但仍然可以使用呼叫站点的清洁.bar
来引用该属性。
答案 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'的条目的情况下,仍然更喜欢地图。仍然希望有人有更好的解决方案。