一、什麼是Groovy及特點
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擁有處理原生類型,面向對象以及一個Ant DSL,使得建立Shell Scripts變得非常簡單。
6、在開發Web,GUI,資料庫或控制台程式時 通過 減少架構性代碼 大大提高了開發者的效率。
7、支援單元測試和模拟(對象),可以 簡化測試。
8、無縫內建 所有已經存在的 Java對象和類庫。
9、直接編譯成Java位元組碼,這樣可以在任何使用Java的地方 使用Groovy。[2]
10、支援函數式程式設計,不需要main函數。
11、一些新的運算符。
12、預設導入常用的包。
13、斷言不支援jvm的-ea參數進行開關。
14、支援對對象進行布爾求值。
15、類不支援default作用域,且預設作用域為public。
16、groovy中基本類型也是對象,可以直接調用對象的方法。
二、文法
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線上編譯位址: http://groovy.jsrun.net/
1.沒有類型的java
作為動态語言,groovy中所有的變量都是對象(類似于.net framework,所有對象繼承自java.lang.Object),在聲明一個變量時,groovy不要求強制類型聲明,僅僅要求變量名前使用關鍵字def(從groovy jsr 1開始,在以前的版本中,甚至連def都不需要)。
修改main 方法中的代碼:
def var="hello world"
println var
println var.class
你可以看到程式最後輸出了var的實際類型為:java.lang.String
作為例外,方法參數和循環變量的聲明不需要def。
2.字元串連接配接符
跟java一樣,如果你需要把一個字元串寫在多行裡,可以使用+号連接配接字元串。代碼可以這樣寫:
def var="hello "+
"world"+
",groovy!"
當然更groovy的寫法是:
def var="""hello
world
groovy!"""
三個”号之間不在需要+号進行連接配接(不過字元串中的格式符都會被保留,包括回車和tab)。
3. 一切皆對象
groovy對于對象是什麼類型并不關心,一個變量的類型在運作中随時可以改變,一切根據需要而定。如果你賦給它boolean ,那麼不管它原來是什麼類型,它接受boolean值之後就會自動把類型轉變為boolean值。看下面的代碼:
def var="hello "+
"world"+
",groovy!"
println var;
println var.class;
var=1001
println var.class
輸出結果:
hello world,groovy!
class java.lang.String
class java.lang.Integer
var這個變量在程式運作中,類型在改變。一開始給它指派String,它的類型就是String,後面給它指派Integer,它又轉變為Integer。
4.循環
删除整個源檔案内容,用以下代碼替代:
def var="hello "+
"world"+
",groovy!"
def repeat(val){
for(i = 0; i < 5; i++){
println val
}
}
repeat(var)
輸出:
hello world,groovy!
hello world,groovy!
hello world,groovy!
hello world,groovy!
hello world,groovy!
注意循環變量i前面沒有def。當然也沒有java中常見的int,但如果你非要加上int也不會有錯,因為從Groovy1.1beta2之後開始(不包括1.1beta2),groovy開始支援java經典的for循環寫法。