目前你基本上已經熟練掌握Groovy的基本語法了,當然其中部分原因是它跟Java語法很像。但這種相似有時可能是「詐」,所以本節來討論那些經常困擾Java開發人員的語法。
Groovy有大量可以省略的語法,比如:
- 語句結束處的分號;
- 返回語句(
return
); - 方法參數兩邊的括號;
public
訪問限定符。
這類設計是為了讓源碼更簡潔,在快速設計原型時都能體現出優勢來。
其他修改包括去掉已檢查和未檢查異常之間的區別,相等概念的替代辦法,以及不再使用內部類。我們先從最簡單的開始:可選的分號和返回語句。
8.3.1 可選的分號和返回語句
在Groovy中,語句結束處的分號(;
)是可選的,除非一行中有多條語句,否則都可以省略。
此外,從方法中返回對像或值時不必使用return
關鍵字。Groovy會自動返回最後一個表達式的計算結果。
代碼清單8-1演示了這些可選語法,並返回了方法中最後一個表達式的計算結果3。
代碼清單8-1 分號和返回語句可以省略
//沒有分號
Scratchpad pad = new Scratchpad
println(pad.doStuff)
public class Scratchpad
{
public Integer doStuff
{
def x = 1
def y; def String z = \"Hello\";
x = 3
//沒有返回語句
}
}
上面的代碼看起來跟Java還是很像,而Groovy的簡潔風格其實還要更強。接下來你會看到Groovy如何省略方法參數兩邊的括號。
8.3.2 可選的參數括號
如果Groovy裡的方法調用至少有一個參數,並且沒有二義性,則可以省略括號。也就是說下面的代碼
println(\"It\'s Groovy baby, yeah!\")
可以寫成
println \"It\'s Groovy baby, yeah!\"
代碼變得更簡潔了,可讀性仍然沒受影響。
下一個特性是可選的public
訪問限定符,再用上它,Groovy代碼看起來就不太像Java了。
8.3.3 訪問限定符
優秀的Java開發人員都知道確定類、方法和變量的訪問級別是面向對像設計的重要組成部分。跟Java一樣,Groovy也有public
、private
和protected
級別;但和Java不同,Groovy的默認訪問級別是public
。所以我們把代碼清單8-1改一下,去掉一些默認的public
限定符,加幾個privte
限定符,如代碼清單8-2所示。
代碼清單8-2 public
是默認訪問限定符
Scratchpad2 pad = new Scratchpad2
println(pad.doStuff)
class Scratchpad2 //沒有指定public訪問限定符
{
def private x;
Integer doStuff
{
x = 1
def y; def String z = \"Hello\";
x = 3
}
}
繼續語法精簡的主題,作為一名Java開發人員,你對用在方法簽名中拋出已檢查異常的throws
語句熟不熟悉?
8.3.4 異常處理
跟Java不同,Groovy不區分已檢查異常和未檢查異常。Groovy編譯器會忽略方法簽名中的所有throws
語句。
在保證源碼可讀的前提下,Groovy採用了一些快捷語法來簡化代碼。接下來看一個有嚴重語義影響的語法變化:相等操作符。
8.3.5 Groovy中的相等
遵循最小意外原則,Groovy把==
當做Java中的equals
方法。這是直覺式開發人員的又一項福利,他們不必再像用Java時為原始類型和對像倒騰==
和equals
。
檢查真實的對象是否相等,需要使用Groovy內置的is
函數。這一規則有個例外,就是你仍然可以用==
來檢查一個對象是否為null
。代碼清單8-3說明了這些特性。
代碼清單8-3 Groovy中的相等
Integer x = new Integer(2)
Integer y = new Integer(2)
Integer z = null
//隱含的equals調用
if (x == y)
{
println \"x == y\"
}
//檢查對象是否相等
if (!x.is(y))
{
println \"x is not y\"
}
//用is檢查是否為null
if (z.is(null))
{
println \"z is null\"
}
//檢查是否為null
if (z == null)
{
println \"z is null\"
}
當然,如果你喜歡,仍然可以用equals
方法檢查相等關係。
最後,還有一個應該簡單提一下的Java結構——內部類,Groovy中它基本被一個新的語言結構取代了。
8.3.6 內部類
Groovy支持內部類,但大多數情況下我們應該用函數字面值替代它。下一節討論函數字面值,它是一個很強的現代編程結構,應該佔用更多篇幅介紹。
用Groovy可以寫出更簡潔的代碼,而且並不影響代碼的可讀性,如果你喜歡,仍然可以繼續使用Java的(大多數)語法結構。接下來,你會看到一些Java還不具備的Groovy語言特性。其中的某些特性很可能就是你選用Groovy的關鍵,比如XML處理。