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

发布于 2024-12-12 04:00:09 字数 388 浏览 0 评论 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)
    }
}

Using ExpandoMetaClass Static Methods can be added dynamically, how can i use this ExpandoMetaClass in Singleton object, with overloaded static function in it, let say the sample program need to be re written using ExpandoMetaClass whats needs to changed in the below program

@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)
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

绅刃 2024-12-19 04:00:09

使用单例的原因之一是避免类中具有静态状态和方法。如果您使用@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()

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

One of the reasons to use a singleton is to avoid having static state and methods in a class. If you're using @Singleton, there's no reason to have static methods or fields. The way to use a singleton is like this:

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

println TestA.instance.methodX()

You can extend the singleton using ExpandoMetaClass like so:

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

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

If you really want a static method, you can do something like this:

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

Note that if you override the class metaClass, rather than the instance metaClass, it won't apply to the instance if the instance has already been created. To get around this use @Singleton(lazy = true) and override the metaClass before accessing the instance.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文