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