临近年关手头比较闲,去看了一下Groovy的官方文档,才发现原来Groovy中带了那么多的注解,很多注解带来的效果,有时候让人感觉“这不是在变魔法吧”。

个人很喜欢Groovy,写不成Ruby,Groovy一样让我很愉悦。可惜在国内Groovy实在没什么人气,连个像样的官方站都没有,或许是因为喜欢脚本的都在写ruby,python,写Java的又对他不屑一顾?

接下来的一系列文章,就只介绍一些我个人觉得很好用,在开发中用到机会会比较多的注解。

PS:强烈推荐Groovyr官方文档,相当的详细,地址:http://www.groovy-lang.org/documentation.html,不用担心是英文,有点代码经验的,一看示例代码就知道是什么意思了。

好了,闲话少说,第一个注解:Memoized

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从而提高效率原理是差不多的,不过这样小小的一个注解,可以少写好多代码省不少事了:)

好了,就到这里了,休息,休息一下

												

Groovy中那些神奇注解之Memoized的更多相关文章

  1. Groovy中那些神奇注解之ToString

    继续上一篇:Groovy中那些神奇注解之Memoized 这篇就讲讲@groovy.transform.ToString这个注解,这注解太熟悉了,熟悉到让人一看就知道是干吗的,不就是把Bean转在St ...

  2. Groovy中那些神奇注解之InheritConstructors

    上一篇:Groovy中那些神奇注解之ToString 写完ToString,本来想今天就写到这了,突然觉得InheritConstructors注解实在也是个神器,写起来也没多少字,还是写了吧. In ...

  3. Mybatis中的@SelectKey注解

    一.创建Maven项目 在pom.xml中,添加mybatis依赖,mysql-jdbc依赖,把编译版本改为1.8 你问,为啥mybatis不会自动依赖mysql-jdbc,需要手动写明?答:因为my ...

  4. Groovy中的面向对象

    Groovy中的面向对象 前面说到groovy支持脚本和类,前面一节已将简单说了脚本和类之间的关系,这一节主要介绍一下groovy中类的相关知识,即面向对象相关知识. 1.类型 1.1 原始类型 gr ...

  5. 深入理解spring中的各种注解

    Spring中的注解大概可以分为两大类: 1)spring的bean容器相关的注解,或者说bean工厂相关的注解: 2)springmvc相关的注解. spring的bean容器相关的注解,先后有:@ ...

  6. Java中万恶的注解

    本文由码农网 – 孙腾浩原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 当Java 1.5引入注解,企业开发者对简化EJB和其他企业产品开发抱有很大期望.可以看一看同一时期的一篇文章 ...

  7. Junit中常用的注解说明

    Java注解((Annotation)的使用方法是@注解名 ,能通过简单的词语来实现一些功能.在junit中常用的注解有@Test.@Ignore.@BeforeClass.@AfterClass.@ ...

  8. ASP.NET MVC5中的数据注解

    ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证(在服务器端和客户端验证数据的有效性) 数 ...

  9. 深入理解spring中的各种注解(转)

    Spring中的注解大概可以分为两大类: 1)spring的bean容器相关的注解,或者说bean工厂相关的注解: 2)springmvc相关的注解. spring的bean容器相关的注解,先后有:@ ...

随机推荐

  1. IE下的bug

    断断续续的在开发过程中收集了好多的bug以及其解决的办法,都在这个文章里面记录下来了!希望以后解决类似问题的时候能够快速解决 ,也希望大家能在留言里面跟进自己发现的ie6 7 8bug和解决办法! 1 ...

  2. Java 7源码分析第13篇 - 字节输入输出流(1)

    上一篇介绍了关于字节输入输出流的Java类框架,同时也简单介绍了一下各个类的作用,下面就来具体看一下这些类是怎么实现这些功能的. 1.InputStream和OutputStream InputStr ...

  3. Nginx修改配置实现图片防盗链

    一般情况下,防盗链是针对软件下载和图片的,由于一般的站点不提供资源下载,所以本文主要是针对图片的防盗链 1.如果对全站图片做防盗链,至少需要一个另外的域名存放指向图片.因为如果对全站图片做了防盗链,包 ...

  4. byte与sbyte的转换

    C#实现byte与sbyte的转换 byte[] mByte; sbyte[] mSByte = new sbyte[mByte.Length]; ; i < mByte.Length; i++ ...

  5. Continue

    Continue 其作用为结束本次循环.即跳出循环体中下面尚未执行的语句. 对于while循环,继续求解循环条件. 对于for循环程序流程接着求解for语句头中的第三个部分expression表达式. ...

  6. 14.java.lang.EOFException

    java.lang.EOFException 文件已结束异常 当程序在输入的过程中遇到文件或流的结尾时,引发异常.因此该异常用于检查是否达到文件或流的结尾

  7. Robot Framework作者建议如何选择自动化测试框架

    本文摘自:InfoQ中文站http://www.infoq.com/cn/news/2012/06/robot-author-suggest-autotest Robot Framework作者建议如 ...

  8. Unix/Linux环境C编程入门教程(6) 安装Fedora C/C++开发环境

    安装Fedora  C/C++开发环境 1 Fedora 是一个开放的.创新的.前瞻性的操作系统和平台,基于 Linux. 2.选择自定义配置 3.设置版本为10.0 4.选择稍后安装 5.选择64位 ...

  9. 使用MD5完成自定义Person对象的加密过程

    ---恢复内容开始--- 首先:我们对自定义Person对象的加密过程所用的方法是归档写入文件的方法. 第一步:创建Person,继承于NSObject,然后在Person.h文件遵守NSCoding ...

  10. Eclipse无法识别(手机)设备的解决方案

    遇到问题 开始学习android一个多月了,用Eclipse开发,用android手机调试.之前一直好好的,突然Eclipse无法识别手机设备了.纠结了好久,找了各种解决方法,弄了一晚上终于解决问题了 ...