【问题标题】:How to set a new property and provide its setter in Groovy如何在 Groovy 中设置新属性并提供其设置器
【发布时间】:2015-01-26 01:54:38
【问题描述】:

我有这个 groovy 类:

class Car {
    int speed = 0
}

我想使用元编程来引入一个新属性“颜色”,并为 Car 对象的实例提供 setColor 方法,如下所示:

 def c = new Car()

 c.metaClass.setProperty("color", "red")

 c.metaClass.setColor = { 
       def newColor-> "color switched from $existingColor to $newColor
 }

我的最终目标是当我打电话时:

c.color("yellow")

打印出来:

color switched from red to yellow"

我已经让 c.color 部分与我上面的代码一起工作,但不是第二部分 (setColor)。

有人可以帮我完成这个,或者告诉我这是否可能吗?

谢谢。

【问题讨论】:

    标签: groovy closures metaprogramming


    【解决方案1】:

    当你添加一个属性时,你会免费获得 getter 和 setter,例如

    class Car {
        int speed = 0
    }
    def c = new Car()
    c.metaClass.setProperty("color", "red")
    assert c.color == 'red'
    c.setColor('blue')
    assert c.getColor() == 'blue'
    

    如果最终目标是调用一个名为color 的方法来设置color 属性,您可以像这样添加一个:

    c.metaClass.color << { col ->
        println "color switched from $delegate.color to $col"
        c.color = col
    }
    
    c.color('yellow') // prints "color switched from blue to yellow"
    assert c.color == 'yellow'
    

    【讨论】:

      【解决方案2】:

      你已经非常接近让它工作了。由于您创建了一个具有 setter 的新属性,因此您所要做的就是:

       c.metaClass.getColor = {'red'}
      
       c.metaClass.setColor = { 
             def newColor-> println "color switched from ${delegate.color} to $newColor"
       }
      
       c.color = "yellow"
      

      请注意,这不会设置属性,而只是提供一种机制来为代表颜色注入 get 和 set 方法。

      这样做可能会解决这个问题:

      def currentColor = 'red'
      def previousColor = '' 
      c.metaClass.getColor = { currentColor }
      c.metaClass.getPreviousColor = { previousColor }
      
      c.metaClass.setColor = { 
         def newColor-> previousColor = delegate.color; currentColor = newColor
      }
      c.color = "yellow"
      println "Changed color from $c.previousColor to $c.color"
      c.color = "blue"
      println "Changed color from $c.previousColor to $c.color"
      

      但现在我们进入的是纯粹用于实验而非生产的代码:)

      【讨论】:

        猜你喜欢
        • 2018-08-25
        • 2016-07-02
        • 2012-05-31
        • 2011-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-09
        • 1970-01-01
        相关资源
        最近更新 更多