首页 » Java程序员修炼之道 » Java程序员修炼之道全文在线阅读

《Java程序员修炼之道》第8章 Groovy:Java的动态伴侣

关灯直达底部

内容提要

  • 为什么学习Groovy
  • Groovy的基本语法
  • Groovy和Java之间的差别
  • Groovy之于Java独有的特性
  • Groovy为何又是脚本语言
  • Groovy与Java的互操作性

Groovy是一种面向对象的动态类型语言,跟Java一样运行在JVM上。实际上,你可以把它看成是给Java静态世界补充动态能力的语言。Groovy项目最初是由James Strachan和Bob McWhirter在2003年末创建的,2004年其领导者变成了Guillaume Laforge。如今http://groovy.codehaus.org/上的Groovy社区仍在蓬勃发展。人们认为Groovy是继Java之后最流行的JVM语言。

受到Smalltalk、Ruby和Python的启发,Groovy已经实现了几个Java不具备的语言特性,比如:

  • 函数字面值;
  • 对集合的一等1支持;
  • 对正则表达式的一等支持;
  • 对XML处理的一等支持。

1 这里所说的“一等”是指内置到语言的语法中,不需要调用类库。

注意 在Groovy中,函数字面值也叫闭包。正如第7章所说的,它们是能够放进变量中的函数,能传递给方法,能像其他值一样操作。

那么我们为什么要用Groovy呢?如果你还记得第7章的多语言编程金字塔,也应该还记得Java不是解决动态层问题的理想语言。这些问题包括快速Web开发、原型设计、脚本处理以及其他很多问题。Groovy就是要解决这些问题。

这里有一个体现Groovy价值的例子。比如老板让你写一个Java例程,把一堆Java bean转成XML。用Java当然可以完成这个任务,而且有很多API和类库可以选用:

  • Java 6中的Java Architecture for XML Binding(JAXB)和Java API for XML Processing(JAXP);
  • Codehaus上的XStream类库;
  • Apache的XMLBeans类库。

当然还不止这些……

这个过程很费工。比如说,要在JAXB下输出Person对象对应的XML,你必须写出:

JAXBContext jc = JAXBContext.newInstance (/"net.teamsparq.domain/");ObjectFactory objFactory = new ObjectFactory;Person person = (Person) objFactory.createPerson;person.setId(2);person.setName (/"Gweneth/");Marshaller m = jc.createMarshaller;m.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);m.marshal (person, System.out);  

Person类必须是标准的Java bean,有完整的获取和设置方法。

Groovy的方式与此不同,因为它把XML当做一等公民对待。这是上面那段代码的Groovy实现:

def writer = new StringWriter;def xml = new groovy.xml.MarkupBuilder(writer);xml.person(id:2) {  name /'Gweneth/'  age 1}println writer.toString;  

看到了吧,用这种语言写代码非常快,并且它和Java很像,Java开发人员很容易掌握。

Groovy还可以帮你减少套路代码的编写工作,比如Groovy处理XML和循环遍历集合的方式要比Java更简洁。因为Groovy跟Java的互操作性很好,所以在Java中很容易利用Groovy的动态性和语言特性。

因为跟Java的语法很像,所以对于Java开发人员来说,Groovy的学习曲线很平滑,并且只要有Groovy的JAR就可以开始了。希望你看完本章后能跟新语言拍档默契!

既然Groovy在由JVM执行之前经过了完整的分析、编译和生成过程,有些开发人员会想:“为什么它不能在编译时把那些明显的错误挑出来呢?”要记住Groovy是动态语言,它的类型检查和绑定都是在运行时做的。

Groovy的性能

如果你的软件性能要求很严格,Groovy语言并不是最好的选择。Groovy的对象都扩展自GroovyObject,它有一个invokeMethod (String name, Object args)方法。Groovy的方法不能像Java中那样直接调用,而是通过之前提到的invokeMethod (String name, Object args)方法执行。这个方法会自行执行一些反射调用和查找,这自然会降低处理速度。Groovy语言的开发者已经做了一些优化,而且在接下来的新版本中,Groovy会利用JVM中新的字节码invokedynamic做更多优化。

Groovy在做某些重活时还是靠Java,并且它要调用已有的Java类库很容易。因为Groovy能和Java一起使用它的动态类型和新语言特性,所以它是一种卓越的快速原型设计语言。Groovy还能作为脚本处理语言使用,因此它以Java的灵活、动态伴侣而著称。

本章一开始会跑几个简单的Groovy例子。一旦你熟悉了简单Groovy程序的运行,就可以开始学习Groovy的具体语法了,还有对于Java开发人员来说比较难缠的Groovy内容。本章接下来就深挖一下Groovy的真金真银,讨论Java不具备的几个语言特性。最后,你可以学习在JVM上混合使用Java和Groovy代码,成为一名多语言程序员。