對於一個Domain類對象,如下面的例子:
class Empl
{
String name
}
我們需要對它進行操作,比如打印“name”屬性的值,我們首先要對它進行非 空判斷,如下:
def em
if(em)
{
println"name: $em.name"
}
em = new Empl()
em.name = 'Tom'
if(em)
{
println"name: $em.name"
}
很顯然,如果不做非空判斷,那麼在第一個println語句就會拋出一個Exception,做了判 斷,則不會出任何的問題。
當然,對於我們的敏捷編程來說,上面的if語句雖然簡單,但仍然是麻煩的。基於這樣的 原因,Groovy語言為我們提供了“?.”操作符。
使用“?.”操作符,我們可以把上面的語句段修改為如下:
def em
println"name: ${em?.name}"
em = new Empl()
em.name = 'Tom'
println"name: ${em?.name}"
其中,“em?.”是判斷em對象是否為空,如果為空,則不再往下計算,而是將 整個計算式返回一個null。
上面的語句段的執行結果為:
name: null
name: Tom
這樣的簡化的確是讓我們的編碼方便了很多。
我們甚至可以寫出形如下面的代碼:
println"city name: ${em?.addr?.city?.name }"
想想看,這樣的代碼如果用if語句進行判斷,那將會是怎樣的繁瑣?
一提到“?”運算符,我們很容易想起Java語言的“?”運算符,想 起類似下面的代碼行:
def em
println em==null?"":em.name
這曾經是我們津津樂道的Java語言為我們做的簡化。對於這樣一個簡化了的語句,Groovy 語言仍然為我們做了進一步的簡化:
def em
println em ? em.name:""
是不是更加簡單了一些?
值得注意的是,“em?”是當em對象不為空的時候為true,所以上面的語句中 ,“em.name”在前面,而“”在後面。