簡介
Groovy是用于Java虛拟機的一種敏捷的動态語言,它是一種成熟的,面向對象編程語言,既可以用于面向對象編程,又可以用作純粹的腳本語言。使用該種語言不必編寫過多的代碼,同時又具有閉包和動态語言中的其他特性。
Groovy是JVM的一個替代語言(替代是指可以用Groovy在Java平台上進行Java編程),使用方式基本與使用Java代碼的方式相同,該語言特别适合與Spring的動态語言支持一起使用,設計時充分考慮了Java集成,這使Groovy與Java代碼的互操作很容易。(注意:不是指Groovy替代java,而是指Groovy和java很好的結合編程。
特性
基本特點
1、構建在強大的Java語言之上并添加了從Python,Ruby和Smalltalk等語言中學到的諸多特征,例如動态類型轉換、閉包和
元編程(metaprogramming)支持。
2、為Java開發者提供了現代最流行的編程語言特性,而且學習成本很低(幾乎為零)。
3、支持DSL(Domain Specific Languages領域定義語言)和其它簡潔的語法,讓代碼變得易于閱讀和維護。
4、受檢查類型異常(Checked Exception)也可以不用捕獲。
5、Groovy擁有處理原生類型,面向對象以及一個AntDSL,使得創建Shell Scripts變得非常簡單。
6、在開發Web,GUI,數據庫或控制台程序時通過減少框架性代碼大大提高了開發者的效率。
7、支持單元測試和模拟(對象),可以簡化測試。
8、無縫集成所有已經存在的Java對象和類庫。
9、直接編譯成Java字節碼,這樣可以在任何使用Java的地方使用Groovy。
10、支持函數式編程,不需要main函數。
11、一些新的運算符。
12、默認導入常用的包。
13、斷言不支持jvm的-ea參數進行開關。
14、支持對對象進行布爾求值。
15、類不支持default作用域,且默認作用域為public。
16、groovy中基本類型也是對象,可以直接調用對象的方法。
動态類型
類型對于變量,屬性,方法,閉包的參數以及方法的返回類型都是可有可無的,都是在給變量賦值的時候才決定它的類型,不同的類型會在後面用到,任何類型都可以被使用,即使是基本類型(通過自動包裝(autoboxing)).當需要時,很多類型之間的轉換都會自動發生,比如在這些類型之間的轉換:字符串(String),基本類型(如int)和類型的包裝類(如Integer)之間,可以把不同的基本類型添加到同一數組(collections)中。
閉包
閉包就是可以使用參數的代碼片段,每個閉包會被編譯成繼承groovy.lang.Closure類的類,這個類有一個叫call方法,通過該方法可以傳遞參數并調用這個閉包.它們可以訪問并修改在閉包創建的範圍内的變量,在閉包内創建的變量在閉包被調用的範圍内同樣可以被引用,閉包可以保存在變量中并被作為參數傳遞到方法中。
語法
Groovy語法與Java語言的語法很相似,雖然Groovy的語法源于Smalltalk和Ruby這類語言的理念,但是可以将它想像成Java語言的一種更加簡單、表達能力更強的變體。(在這點上,Ruby與Groovy不同,因為它的語法與Java語法差異很大。)
許多Java開發人員喜歡Groovy代碼和Java代碼的相似性。從學習的角度看,如果知道如何編寫Java代碼,那就已經了解Groovy了。Groovy和Java語言的主要區别是:完成同樣的任務所需的Groovy代碼比Java代碼更少。
類
Groovy類的java類一樣,完全可以用标準java bean的語法定義一個Groovy類。但作為另一種語言,可以使用更Groovy的方式定義的使用類,這樣的好處是,可以少寫一半以上的javabean代碼。
(1)不需public修飾符
如前面所言,Groovy的默認訪問修飾符就是public,如果Groovy類成員需要public修飾,則根本不用寫它。
(2)不需要類型說明
同樣前面也說過,Groovy也不關心變量和方法參數的具體類型。
(3)不需要getter/setter方法
在很多ide(如eclipse)早就可以為程序員自動産生getter/setter方法了,在Groovy中,不需要getter/setter方法--所有類成員(如果是默認的public)根本不用通過getter/setter方法引用它們(當然,如果一定要通過getter/setter方法訪問成員屬性,Groovy也提供了它們)。
(4)不需要構造函數
不再需要程序員聲明任何構造函數,因為實際上隻需要兩個構造函數(1個不帶參數的默認構造函數,1個隻帶一個map參數的
構造函數--由于是map類型,通過這個參數可以構造對象時任意初始化它的成員變量)。
(5)不需要return
Groovy中,方法不需要return來返回值。
(6)不需要()
Groovy中方法調用可以省略()(構造函數除外)。
文件
在Groovy中類和文件的對應關系并不像Java中那麼固定(Java中一個文件隻能有一個聲明為public的類和其他一些非公共的類和内嵌類)。在同一個groovy文件中可以包含多個public的類定義。具體規則如下:
如果在一個groovy文件中沒有任何類定義,它将被當做script來處理,也就意味着這個文件将被透明的轉換為一個Script類型的類,這個自動轉換得到的類将使用原始的groovy文件名(去掉擴展名,沒有包名,在default包中)作為類的名字。groovy文件的内容被打包進run方法,另外在新産生的類中被加入一個main方法以進行外部執行該腳本。
如果在groovy文件正好有一個類的定義,并且該類的名字與文件名稱相同,那麼這就和java中的類與文件的一一對應關系相同。在一個groovy文件中可以包含多個不同可見性的類定義,并且沒有強制性的要求其中有一個類的類名與文件名相同。groovyc編譯器會很樂于把該文件中定義的所有的類都編譯成*.class文件。如果希望能夠直接調用這個groovy script,比如說在使用groovy命令行或者在某個IDE中執行,那麼應該在該文件中的第一個類中定義一個main方法。
在一個groovy文件中可以混合類的定義和腳本定義。在這種情況下,那些腳本代碼将會變成直接調用的主類,所以在這種情況下不應該再定義一個和文件同名的類。
在沒有經過明确的編譯過程即執行時,groovy将通過文件名來查找類。在這種情況下,名稱将會很重要。Groovy隻能找到那些和文件名匹配的類。在找到這種名字匹配的類時,找到的文件中定義的其他類将被解析并變得對groovy可見。
最新版本信息
Groovy2.2,發布于2013年11月。