加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy Tip 13 “.&”运算符

发布时间:2020-12-14 16:59:44 所属栏目:大数据 来源:网络整理
导读:??????????????????????? Groovy Tip 13 “ . ”运算符 ? ? 在Groovy语言中,“ . ”运算符是用来引用一个方法,请看下面的例子: class Foo { ??? ??? def hello(name) ??? ??? { ?????? ??? println "hello,${name}!" ??? ??? } ??? } ? 通常,我们是这样
??????????????????????? Groovy Tip 13 “.&”运算符
?
?
在Groovy语言中,“ .&”运算符是用来引用一个方法,请看下面的例子:
class Foo
{
??? ??? def hello(name)
??? ??? {
?????? ??? println "hello,${name}!"
??? ??? }
???
}
?
通常,我们是这样来使用 Foo 类的 hello 方法:
??? ?Foo foo = new Foo()
?foo.hello( 'world' )
?
现在,我们在 Groovy 语言里也可以这样使用:
??? ?Foo foo = new Foo()
??? ?
??? ?? def hello = foo.&hello
?
??? hello( 'Tom' )
?
语句“ def hello = foo.&hello ”的意思是定义一个“ hello ”对象,并且将它指向“ foo ”对象的“ hello ”方法。然后,我们就可以直接使用刚刚定义的“ hello ”对象。上面的代码的结果为:
hello,Tom!
?
静态方法也可以使用.&”运算符来引用,如下:
class Foo
{
???
??? ??? def static f()
??? ??? {
?????? ??? println 'oh,...'
??? ??? }
}
?
可以这样来使用:
?????? def f = Foo.&f
??????
??? f()
?
结果为:
oh,...
?
简单的介绍到此为止,下面来说说如何在实际的代码中使用它。在实际的编码过程中,记录 log 是免不了的了。如下:
?????? if ( logger .isDebugEnabled()){
?????????? logger .debug( "updateNullCRTarget condition:" );
?????????? logger .debug( "year=" + year);
?????????? logger .debug( "type=" + mytype);
?????????? logger .debug( "buyer=" + buyer);
??? }
?
?
如果你写“ logger.debug ”写烦了,不如这样实现:
?????? def debug = logger.&debug
??????
?????? if (logger.isDebugEnabled()){
?????????? debug( "updateNullCRTarget condition:" );
?????????? debug( "year=" + year);
?????????? debug( "type=" + mytype);
?????????? debug( "buyer=" + buyer);
??? }
?
如果上面的样子看着不舒服,也可以这样实现:
??? ??? def debug = logger.&debug
??????
?????? if (logger.isDebugEnabled()){
?????????? debug "updateNullCRTarget condition:"
?????????? debug "year=$year"
?????????? debug "type=$mytype"
?????????? debug "buyer=$buyer"
??? }
?
?实际的编码过程中可能有很多这样的例子,你会在一段代码中不断的调用另外一个类的方法,如果你讨厌不停的写“对象名 . 方法名”或者“类名 . 方法名”,那么你就可以使用上面的方法。
.&”运算符的第二个用途是委派功能。我们知道,我们如果想要在一个类中使用另一个类的功能,最直接的方法是继承。但我们在很多时候都指出,过多使用继承会导致很多的副作用。在Groovy语言中,我们常常使用委派来代替继承。
.&”运算符也能实现功能的委派,而且是动态委派的基础。下面,我们来看看它是如何实现委派的:
class Foo
{
??? ??? def hello()
??? ??? {
?????? ??? println "hello,world!"
??? ??? }
???
}
?
下面有一个 World 类:
class World
{
???
}
?
可以看到, World 类没有任何的方法,它现在想继承 Foo 类的 hello 方法。
??? ?Foo foo = new Foo()
?
?????? World.metaClass.hello = foo.&hello
?
?????? def w = new World()
??? ?
?w.hello()
?
?
运行结果为:
hello,world!
?
?
.&”运算符 除了上面的用法,我们还需要记住的是,形如“ def hello = foo.&hello ”的语句同时也声明了“ hello ”对象是一个闭包,闭包的任何用法都可以使用在“ hello ”对象上,如可以把它当对象一样传递,可以 curry ,可以复合等等。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读