在Expando中注入一个Groovy闭包,作为属性



我有一个类扩展和注入动态属性。

class Dynamo extends Expando {
}
Dynamo dynamic = [ firstName: 'bob', lastName: 'dobbs' ]

我想创建一个动态属性fullName,计算结果为"$lastName, $firstName"

虽然它可以这样做:

dynamic.fullName = { "$lastName, $fullName" }

它需要调用()或隐式调用with()来返回字符串,否则它只给出闭包toString()

assert dynamic.fullName() == 'dobbs, bob'

通过

,

assert dynamic.fullName == 'dobbs, bob'

失败因为求值为闭包的toString

我总是可以这样做

Dynamo dynamic = [ firstName: 'bob', lastName: 'dobbs', fullName: 'dobbs, bob' ]

但这不是DRY…

对于无参数方法,Groovy需要括号。我能想到两个解决办法:

解决方案1:元类的getter getFullName:

Dynamo dynamo = [ firstName: 'bob', lastName: 'dobbs' ]
dynamo.metaClass.getFullName = { "$lastName, $firstName" }
assert dynamo.fullName == 'dobbs, bob'

方案二:getProperty:

钩入属性getter
Dynamo dyn2 = [ firstName: 'john', lastName: 'doe' ]
dyn2.metaClass.getProperty = { String property ->
    if (property == "fullName") { 
        "${delegate.lastName}, ${delegate.firstName}" 
    } 
}
assert dyn2.fullName == 'doe, john'

最新更新