Groovy

Groovy

Groovy是一種基於JVM(Java虛擬機)的敏捷開發語言,它結合了Python、Ruby和Smalltalk的許多強大的特性,Groovy 代碼能夠與 Java 代碼很好地結合,也能用於擴展現有代碼。由於其運行在 JVM 上的特性,Groovy 可以使用其他 Java 語言編寫的庫。

基本信息

簡介

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。

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可見。

最新版本信息

Groovy 2.2,發布於2013年11月。

相關詞條

相關搜尋

熱門詞條

聯絡我們