内容提要
- 为什么学习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代码,成为一名多语言程序员。