Groovy是連接腳本語言和企業級Java世界的橋樑 二

       Groovy是連接腳本語言和企業級Java世界的橋樑 二

 

 

 

IndicThreads >> Groovy語言有一天可能成爲Java世界的標準腳本語言嗎?這樣我就可以作爲Java SE/EE的一部分下載到。在Java 6,Mustang版本中,可能會出現對Groovy的一些支持嗎?

 

Guillaume Laforge >> Java 6,即衆所周知的"Mustang",會包含JSR-223,"JavaTM平臺的腳本"。目前實現JSR-223的參考提供了和Groovy語言的集成,所以如果你想用它,你就可以馬上使用,甚至是在JDK1.4或5.0中使用。你不得不使用一個次新版的Groovy,因爲目前,提供的最新版只是一個beta版。

"Java 6,"Mustang",會包含JSR-223,"JavaTM平臺的腳本"..."

Mustang的betas版集成了一個稍微修改過的JSR-223版本,僅僅只集成了Rhino,來自Mozilla的JavaScript引擎。不幸的是,據我所知,他們沒有集成Groovy。所以我們不得不爲Java 6創建我們自己的腳本引擎,但是可以確定的是我們在Java 6 願意做這件事之前就已經做好了準備。

 

IndicThreads >>X跟Y的比較永遠能夠吸引眼球。我能夠引起您對於Groovy和Jpython的比較的興趣嗎?

 

Guillaume Laforge >>坦白的說,我對於這類的比較沒有什麼興趣。這裏有很多原因這樣做。首先,我不知道其他的JVM語言是否足夠好,以至於我們可以做一個公平的比較。我也不想散佈一些否定的斷言,因爲我帶着有偏見的視角。最後一個原因是我不想和其他的語言在"我的比你的好"這樣的論調中戰鬥,因爲這是浪費時間,最重要的原因是我們是同舟共濟的!我們都希望有好的腳本語言可以嵌入到我們的應用中來,或者寫成獨立的應用!

"我們都希望有好的腳本語言可以嵌入到我們的應用中來,或者寫成獨立的應用!..."

如果你已經寫了Python程序好多年,你將會選擇Jpython,所以我猜如果你的團隊成員都很熟悉Python,那麼將沒有特別好的理由來選擇Groovy。如果你已經很熟悉Ruby,那麼也是相同的情況,你將選擇Jruby。如果你更喜歡普通的類Java語法加上一點弱類型,那麼BeanShell也將是更好的選擇。如果你也喜歡類Java的語法,但是更喜歡儘可能的使用強大的APIs,能夠使用Groovy 元對象協議來進行高級的類操作的話,Groovy語言將更爲合適一些。

"如果你的團隊非常熟悉Python,那麼就沒有特別的理由來選擇Groovy(超過選擇Jpython)..."

每一種語言都有它的優點和缺點,我真的不能(隨便)推薦我自己的,雖然我的偏愛會直接選擇Groovy,因爲它的表達語言和高級特性。但這依賴於你的用例。

 

IndicThreads >>您是怎麼決定Groovy語言的發展的?Groovy語言是在盡力的修補Java語言的一切弱點嗎?您是否也從其他的語言如Python和Ruby中採納了一些思想?

 

Guillaume Laforge >>就目前而言,沒有太多的思想加入到Groovy中來,因爲接下來的幾個月裏,在第一個發佈版本以前,我們將進入一個"特性冰凍"的模式。所以我們不想再加入新的東西,除了性能的提升或bug的修改。Groovy語言決定提供一些對於通用的、廣泛使用的APIs的包裝類。所以我們得到了順手的類來處理JDBC,創建Swing GUI接口,或者可以非常容易的操作Ant任務。但是很清楚的是,我們不想創建我們自己版本的APIs,我們僅僅是提供一些語法糖來將複雜的工作簡單化--像處理數據庫連接或流處理。

"在Java中困擾我們的是一切的我們不得不寫的樣板代碼..."

"通過使用(Groovy語言的)閉包和ad hoc方法,我們可以安全的忘掉那些重複的和煩人的樣板代碼片段,從而關注手邊的主要任務..."

在Java中困擾我們的是一切的我們不得不寫的樣板代碼,例如集合的遍歷,這些代碼是爲了正確的處理資源。通過使用閉包和ad hoc方法,我們可以安全的忘掉那些重複的和煩人的樣板代碼片段,從而關注手邊的主要任務。Groovy語言讓我們在這些情況下更加產品化,並且能夠使得我們避免犯一些普通的錯誤,如忘記關閉流,等等。

"一旦你習慣了閉包的概念,你將會被牢牢的吸引住,你會納悶爲什麼Java仍然沒有支持這個特性!..."

我們從一些知名的腳本語言中吸取了一些思想。其中最大的特性就恰恰是閉包,它來自於一些語言例如SmallTalk和Ruby。一旦你習慣了閉包的概念,你將會被牢牢的吸引住,你會納悶爲什麼Java仍然沒有支持這個特性!

 

IndicThreads >> "閉包支持"在Groovy網站上被列爲Groovy語言的第一特性。您能不能告訴我們什麼是閉包,最好能有一個例子?

 

Guillaume Laforge >>閉包很簡單,就是能夠重用和發佈的代碼塊。這是一個概念,很不幸的是,到今天也不存在於Java語言中。如果我對於Java語言只有一個特性要求,那麼它就是自然的支持閉包!

"閉包很簡單,就是能夠重用和發佈的代碼塊..."

在Groovy中,閉包看起來就是由大括號包圍起來的語句段。至於例子,下面的語句行就是一個閉包:

{ println "hello" }

但是你能夠把這個閉包分配給一個變量:

def helloClosure = { println "hello" }

 

然後,你就可以調用這個閉包,就像它是一個普通的方法一樣:

helloClosure() // and it'll print hello

你可以傳遞一個參數給一個閉包:

def printer = { msg -> println "your message is: $msg" }

 

然後,你就可以調用和重用這個"printer"閉包:

printer( "hello" )
printer( "Groovy!" )

 

現在,讓我們看一個更有用的例子。例如,你有一個list對象,你想過濾:

def myNumbers = [1, 2, 3, 4, 5]
def criteria = { it > 3 } // 'it' is an implicit parameter
def result = myNumbers.findAll( criteria )

 

你可以傳遞一個條件到"findAll()"方法裏,使得它能夠找到list對象中大於3的數字。你也可以使用匿名的閉包:

def result = myNumbers.findAll { it > 3 }

 

在Java語言中,你會不得不寫一段的樣板代碼來做這樣一個過濾集合的簡單事情!在Groovy語言中,它只有簡單的一行。

閉包可以給你更加有表達性的代碼,通過允許你重用代碼段來操作集合和其他的事情。

(未完待續)

發佈了142 篇原創文章 · 獲贊 19 · 訪問量 95萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章