ExpandoMetaClass - Статические методы + синглтон + перегруженные функции - PullRequest
0 голосов
/ 25 октября 2011

Использование ExpandoMetaClass Статические методы могут быть добавлены динамически, как я могу использовать этот ExpandoMetaClass в объекте Singleton с перегруженной статической функцией в нем, скажем, пример программы необходимо переписать с использованием 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)
    }
}

1 Ответ

2 голосов
/ 25 октября 2011

Одна из причин использования синглтона - избегать статического состояния и методов в классе.Если вы используете @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) и переопределите метакласс, прежде чем получить доступ к экземпляру.

...