Groovy ExpandoMetaClass-静态方法+;单身人士+;重载函数
使用ExpandoMetaClass可以动态添加静态方法,如何在Singleton对象中使用此ExpandoMetaClass,其中包含重载的静态函数,假设需要使用ExpandoMetaClass重新编写示例程序,下面的程序需要更改什么Groovy ExpandoMetaClass-静态方法+;单身人士+;重载函数,groovy,expandometaclass,Groovy,Expandometaclass,使用ExpandoMetaClass可以动态添加静态方法,如何在Singleton对象中使用此ExpandoMetaClass,其中包含重载的静态函数,假设需要使用ExpandoMetaClass重新编写示例程序,下面的程序需要更改什么 @Singleton class testA { def static zMap = [:] static def X() { Y() } static def Y() { } static
@Singleton
class testA {
def static zMap = [:]
static def X() {
Y()
}
static def Y() {
}
static def X(def var) {
Y(var)
}
static def Y(def var) {
zMap.put(var)
}
}
使用单例的原因之一是避免类中有静态状态和方法。如果您使用的是
@Singleton
,那么就没有理由使用静态方法或字段。使用单例的方法如下:
@Singleton class TestA {
def someField = "hello"
def methodX() {
someField
}
}
println TestA.instance.methodX()
TestA.metaClass.static.methodY = { -> "I am static" }
println TestA.methodY()
您可以使用ExpandoMetaClass扩展singleton,如下所示:
TestA.instance.metaClass.newMethod = { -> "foo" }
TestA.instance.metaClass.methodX = { -> "goodbye" }
println TestA.instance.newMethod()
println TestA.instance.methodX()
如果确实需要静态方法,可以执行以下操作:
@Singleton class TestA {
def someField = "hello"
def methodX() {
someField
}
}
println TestA.instance.methodX()
TestA.metaClass.static.methodY = { -> "I am static" }
println TestA.methodY()
请注意,如果重写类元类而不是实例元类,那么如果实例已经创建,它将不会应用于实例。要避免这种情况,请使用@Singleton(lazy=true)
并在访问实例之前重写元类