Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy ExpandoMetaClass-静态方法+;单身人士+;重载函数_Groovy_Expandometaclass - Fatal编程技术网

Groovy 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

使用ExpandoMetaClass可以动态添加静态方法,如何在Singleton对象中使用此ExpandoMetaClass,其中包含重载的静态函数,假设需要使用ExpandoMetaClass重新编写示例程序,下面的程序需要更改什么

@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)
并在访问实例之前重写元类