临近年关手头比较闲,去看了一下Groovy的官方文档,才发现原来Groovy中带了那么多的注解,不少注解带来的效果,有时候让人感受“这不是在变魔法吧”。html
我的很喜欢Groovy,写不成Ruby,Groovy同样让我很愉悦。惋惜在国内Groovy实在没什么人气,连个像样的官方站都没有,或许是由于喜欢脚本的都在写ruby,python,写Java的又对他不屑一顾?python
接下来的一系列文章,就只介绍一些我我的以为很好用,在开发中用到机会会比较多的注解。数组
PS:强烈推荐Groovyr官方文档,至关的详细,地址:http://www.groovy-lang.org/documentation.html,不用担忧是英文,有点代码经验的,一看示例代码就知道是什么意思了。缓存
好了,闲话少说,第一个注解:Memoizedruby
Memoized的全称是:groovy.transform.Memoized,在groovy.transform包下,有不少相关的注解,能够好好了解一下函数
至于Memoized的做用,看名字就很明白了,就是“记住”,没错,就是把方法的执行结果缓存起来,下次调用时,若是参数同样,那方法就再也不计算而是直接返回结果了,该注解对于那些参数范围比较少,而且只要参数必定,那么结果确定也是惟一的方法,有着很好的加速效果。测试
举个最简单,可是我的以为最能体现Memoized效果的例子,你们应该都实现过用递归方式实现斐波那契(fibnacci)数列吧,可是纯粹的不加优化的递归方式是至关至关的没效率的,在个人电脑上,计算到40左右,电脑就有点跑不动了,看看代码:优化
class Fibnacci{ long total = 0 //用来统计一共计算了多少次 int n //计算多少的数列 public Fibnacci(int n){ this.n = n } def fibnacci_1(n){ total ++ n < 2 ? 1 : fibnacci_1(n-1) + fibnacci_1(n-2) } @groovy.transform.Memoized def fibnacci_2(n){ total ++ n < 2 ? 1 : fibnacci_2(n-1) + fibnacci_2(n-2) } //测试不使用Memoized def runWithoutMem(){ long start = System.currentTimeMillis() total = 0 def val = fibnacci_1(n) long time = System.currentTimeMillis() - start println "未使用Memoized,${n}的Fibnacci值是${val},共用时${time}毫秒,函数调用共${total}次" } //测试使用Memoized def runWithMem(){ long start = System.currentTimeMillis() total = 0 def val = fibnacci_2(n) long time = System.currentTimeMillis() - start println "使用Memoized,${n}的Fibnacci值是${val},共用时${time}毫秒,函数调用共${total}次" } } def fib = new Fibnacci(40) fib.runWithoutMem() fib.runWithMem()
fibnacci_1和fibnacci_2方法实现是彻底同样的,惟一的不一致就是一个加上了注解,同时我在类里面加上了一个变量total,来统计方法一共被调用了多少次,把上面的代码复制到Groovy自带的GroovyConsole程序中(神器呀),直接就能够运行,看看结果:
结果很惊人吧,由于Memoized把计算的结果缓存下来了,若是参数同样就不用再重复计算了,因此效率天然大大提升,这就好像咱们用数组方法来实现fibnacci从而提升效率原理是差很少的,不过这样小小的一个注解,能够少写好多代码省很多事了:)
好了,就到这里了,休息,休息一下this