如何设置新的 属性 并在 Groovy 中提供其 setter
How to set a new property and provide its setter in Groovy
我有这个 groovy class:
class Car {
int speed = 0
}
我想使用元编程来引入一个新的 属性 "color" 并为 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)。
有人可以帮我完成这个或告诉我这是否可能吗?
谢谢。
当您添加 属性 时,您将免费获得 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'
你已经非常接近让它正常工作了。由于您创建了一个包含 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"
但现在我们进入的代码纯粹是为了实验而不是为了生产:)
我有这个 groovy class:
class Car {
int speed = 0
}
我想使用元编程来引入一个新的 属性 "color" 并为 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)。
有人可以帮我完成这个或告诉我这是否可能吗?
谢谢。
当您添加 属性 时,您将免费获得 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'
你已经非常接近让它正常工作了。由于您创建了一个包含 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"
但现在我们进入的代码纯粹是为了实验而不是为了生产:)