setProperty有异常

时间:2014-04-09 17:11:51

标签: groovy

我知道您可以覆盖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

正如您所看到的,甚至没有使用特殊的setFoosetBar设置器。当然,如果需要,您可以明确地调用它们。您还可以添加类似

的内容
if( property == 'foo' ) setFoo( value )

setProperty的开头使用点访问器语法。但这对我来说似乎有点难看。那么,Groovy中是否有开箱即用的支持,可以为setProperty添加特殊属性,即在上面的案例中为setFoo设置setBarsetProperty例外情况?

非常感谢。

2 个答案:

答案 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'
}