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