ExpandoMetaClass - 静态方法 +单例+重载函数
使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
使用单例的原因之一是避免类中具有静态状态和方法。如果您使用@Singleton,则没有理由使用静态方法或字段。使用单例的方法如下:
您可以使用 ExpandoMetaClass 扩展单例,如下所示:
如果您确实想要一个静态方法,您可以执行如下操作:
请注意,如果您重写类元类,而不是实例元类,如果实例已经创建,则它不会应用于实例。要解决此问题,请使用 @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:You can extend the singleton using ExpandoMetaClass like so:
If you really want a static method, you can do something like this:
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.