我知道您可以覆盖Groovy类中的setProperty
方法来拦截setter逻辑。但是,有时您希望以某种方式拦截大多数setter逻辑,但在少数情况下,您希望拥有特殊逻辑。
例如,假设我们有一个类如下:
class PropertyDemo {
@Override
void setProperty( String property, Object value ) {
println "Setting ${property} to ${value.toString()}"
}
void setFoo( String whatever ) {
println 'Foo'
}
void setBar( String whatever ) {
println 'Bar'
}
static void main( String[] args ) {
PropertyDemo demo = new PropertyDemo()
demo.baz = 'baz'
demo.foo = 'baz'
demo.bar = 'baz'
}
}
main
来电的输出如下:
Setting baz to baz
Setting foo to baz
Setting bar to baz
正如您所看到的,甚至没有使用特殊的setFoo
和setBar
设置器。当然,如果需要,您可以明确地调用它们。您还可以添加类似
if( property == 'foo' ) setFoo( value )
在setProperty
的开头使用点访问器语法。但这对我来说似乎有点难看。那么,Groovy中是否有开箱即用的支持,可以为setProperty
添加特殊属性,即在上面的案例中为setFoo
设置setBar
和setProperty
例外情况?
非常感谢。
答案 0 :(得分:2)
以下是更正后的代码:
@Override
void setProperty(String property, Object value) {
def metaProperty = this.metaClass.getMetaProperty(property)
if(metaProperty) metaProperty.setProperty(this, value)
else println "Setting ${property} to ${value.toString()}"
}
答案 1 :(得分:1)
您只能使用propertyMissing
class PropertyDemo {
def state
void propertyMissing( String property, Object value ) {
state = "Setting ${property} to ${value.toString()}"
}
void setFoo( String whatever ) {
state = 'Foo'
}
void setBar( String whatever ) {
state = 'Bar'
}
}
def demo = new PropertyDemo()
demo.with {
baz = 'baz'
assert state == 'Setting baz to baz'
foo = 'baz'
assert state == 'Foo'
bar = 'baz'
assert state == 'Bar'
}