Groovy Tip 13 “.&”运算符

                        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 ,可以复合等等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值