讀古今文學網 > Java程序員修煉之道 > 8.3 與Java的差異新手陷阱 >

8.3 與Java的差異新手陷阱

目前你基本上已經熟練掌握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也有publicprivateprotected級別;但和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處理。