Preface:
Groovy 是 Java 平台上設計的物件導向編程語言。這門動態語言擁有類似Python、Ruby和Smalltalk中的一些特性,可以作為Java平台的腳本語言使用. Groovy的語法與Java非常相似,以至於多數的Java代碼也是正確的Groovy代碼。Groovy代碼動態的被編譯器轉換成Java位元組碼。由於其運行在JVM上的特性,Groovy可以使用其他Java語言編寫的庫. 如果一樣的功能能夠使用較少的 code 來撰寫, 那等同生產力能夠提升. 下面是來自於 http://Groovy.CodeHaus.org 的一個範例程序:
- package demo
- class Foo {
- void doSomething() {
- def data = ["name": "James", "location": "London"]
- for (e in data) {
- println("entry ${e.key} is ${e.value}")
- }
- }
- void closureExample(collection) {
- collection.each { println("value ${it}") }
- }
- static void main(args) {
- def values = [1, 2, 3, "abc"]
- def foo = new Foo()
- foo.closureExample(values)
- foo.doSomething()
- def printSum = { a, b -> print a+b }
- printSum( 5, 7 )
- }
- }
更多的 Groovy 特色會在後續一一介紹.
Setting up your Groovy environment:
在安裝 Groovy 的開發環境前, 請先確認 JRE/JDK 已經安裝, 接著到 這裡 下載 Installer 安裝或者按照下面步驟安裝 .zip 檔:
我的第一個 Groovy - Hello, World:
Java 常為 script language 詬病的就是雖然我只是要 print 個 Hello word, 還是需要建立一個 class, 然後打上許多的代碼才能夠完成入門的 "Hello word". Groovy 則相對方便:
什麼, 這是 Java 的 code 嗎? 怎麼不用宣告 class 了! 而且更方便的是當你要 print 時, 連 "system.out" 都省了. 而許許多多 Groovy 的特性讓你不但能保留 Java 的優點, 而且能以生產力較高的 script 語言的語法進行開發. (在 groovyConsole UI 中, 要執行代碼請按 CTRL+R)
除了 groovyConsole 之外, Groovy 也提供與 Python 類似的 shell console, 讓你可以在命令提示字元後輸入代碼並執行之:
Variables:
在一開頭我們提到了 Groovy 是一個弱型態語言, 而且它與 Javascript, Python 等 script 語言一樣, 也提供了許多對變數操作便利的 operators 與 conventions:
其中值得注意的是:
- x = "John"
- println "Hi, $x"
Lists and Maps:
Groovy language 預設支援兩種重要的資料結構類型: lists 與 maps (lists 其實就是 Java 的 ArrayList). 而你可以如下初始化 lists 與 maps:
- emptyMap = [:] // 初始化 maps
- emptyList = [] // 初始化 lists
底下是 maps 的操作範例:
Range:
除了 lists 與 maps 外, Groovy 還支援一個相當方便的功能: Range. 透過他你可以很方便地寫出跟 Python 一樣簡潔的 for-loop:
- for (i in 1..5)
- {
- print "$i"
- }
- println ""
- (1..5).each {print it}
More Convenient way:
接著我們來看看 Groovy 還提供什麼語法蜜糖可以讓我們少寫些代碼. 假設你有段代碼如下:
- def app = new Application();
- def server = new Server();
- server.name = app.name;
- server.status = "Test";
- server.sessionCount = 3;
- server.start();
- server.stop();
- server.with {
- name = app.name
- status = "Test";
- sessionCount = 3
- start()
- stop()
- }
- Calendar calendar = Calendar.getInstance();
- calendar.clear();
- calendar.set(Calendar.MONTH, Calendar.JULY);
- calendar.set(Calendar.DATE, 4);
- calendar.set(Calendar.YEAR, 1776);
- Date time = calendar.getTime();
- System.out.println(time);
- def calendar = Calendar.instance
- calendar.with {
- clear()
- set MONTH, JULY
- set DATE, 4
- set YEAR, 1776
- println time
- }
- import java.util.ArrayList as Alist
- def list = new Alist();
- def srv = null;
- if(srv.name.equals("Test"))
- {
- srv.start();
- }
- def srv = null;
- if(srv!=null && srv.name.equals("Test"))
- {
- srv.start();
- }
- if(srv?.name.equals("Test"))
- {
- srv.start();
- }
More Strong/Improvement Point:
Groovy 支援所謂的 Operator overriding. 考慮有個類別定義如下:
- class Complex {
- def re;
- def im;
- def plus(th){ new Complex(re:re+th.re, im:im+th.im);}
- def minus(th) {new Complex(re:re-th.re, im:im-th.im);}
- String toString(){ "$re + $im j" }
- }
- def cx1 = new Complex(re:1,im:2)
- def cx2 = new Complex(re:4,im:8)
- def cx3 = new Complex(re:cx1.re+cx2.re, im:cx1.im+cx2.im)
- println "$cx3" // 5 + 10 j
- def cx3 = cx1+cx2;
- def cx4 = cx1-cx2;
- println "\$cx3=$cx3; \$cx4=$cx4";
Supplement:
* Groovy User Guide
* Getting Groovy With "with"
沒有留言:
張貼留言