首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExpandoMetaClass -静态方法+单例+重载函数

ExpandoMetaClass -静态方法+单例+重载函数
EN

Stack Overflow用户
提问于 2011-10-26 01:16:38
回答 1查看 344关注 0票数 0

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

代码语言:javascript
复制
@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)
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-26 02:09:56

使用单例的原因之一是避免在类中有静态和方法。如果您使用的是@Singleton,那么就没有理由使用静态方法或字段。使用单例的方法如下所示:

代码语言:javascript
复制
@Singleton class TestA {
    def someField = "hello"
    def methodX() {
        someField
    }
}

println TestA.instance.methodX()

您可以使用ExpandoMetaClass扩展单例,如下所示:

代码语言:javascript
复制
TestA.instance.metaClass.newMethod = { -> "foo" }
TestA.instance.metaClass.methodX = { -> "goodbye" }

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

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

代码语言:javascript
复制
TestA.metaClass.static.methodY = { -> "I am static" }
println TestA.methodY()

请注意,如果您覆盖类metaClass,而不是实例metaClass,那么如果实例已经创建,它将不会应用于实例。要解决此问题,请在访问实例之前使用@Singleton(lazy = true)并覆盖metaClass。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7893176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档