讀古今文學網 > Java程序員修煉之道 > 第8章 Groovy: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代碼,成為一名多語言程序員。