0

使用 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)
    }
}
4

1 回答 1

2

使用单例的原因之一是避免在类中包含静态状态和方法。如果您正在使用@Singleton,则没有理由使用静态方法或字段。使用单例的方式是这样的:

@Singleton class TestA {
    def someField = "hello"
    def methodX() {
        someField
    }
}

println TestA.instance.methodX()

您可以像这样使用 ExpandoMetaClass 扩展单例:

TestA.instance.metaClass.newMethod = { -> "foo" }
TestA.instance.metaClass.methodX = { -> "goodbye" }

println TestA.instance.newMethod()
println TestA.instance.methodX()

如果你真的想要一个静态方法,你可以这样做:

TestA.metaClass.static.methodY = { -> "I am static" }
println TestA.methodY()

请注意,如果您覆盖类 metaClass,而不是实例 metaClass,如果实例已经创建,它将不适用于实例。要绕过这种使用@Singleton(lazy = true)并在访问实例之前覆盖元类。

于 2011-10-25T18:09:55.747 回答