我們說基於Groovy語言的Java項目開發是一個敏捷的開發,除了我們使用Grails作為Web開發平台,Groovy語言本身就提供了很多敏捷的地方。
我們知道,在Java語言中,判斷兩個字符串的值是否相等,我們使用equals方法,而“==”作為判斷兩個對象引用是否相同的符號。事實證明,我們使用equals方法多過使用“==”符號,特別是在字符串的使用中。
在實際編碼的過程中,形如:
if(abc1.equals(abc2))
{
……
}
這樣的if語言特別多,但是我們每一次都得拼寫equals方法,而不是簡單的使用“==”符號。雖然Eclipse等IDE能夠幫我們把equals方法拼寫完整,但使用equals方法畢竟耽誤了我們的時間,遠遠沒有使用“==”符號敏捷。
Groovy語言考慮到了我們的這個實際的需求,果斷的使用“==”符號代替了equals方法,來提供Groovy語言編程的敏捷性。
def abc1 = 'abc'
def abc2 = "abc"
println abc1 == abc2
打印的結果為true。
這樣,我們就不必再if(abc1.equals(abc2))了,而可以直接使用:
if(abc1==abc2)
{
……
}
是不是方便了很多?
甚至判斷Collection兩個對象的內容是否相同也可以使用“==”符號,如:
def list1 = [1]
def list2 = [1]
println list1 == list2
你可以把上面的語句運行看看,結果為true。
兩個Map對象的內容是否相同也可以使用“==”符號判斷,如:
def map1 = ['name':'tom']
def map2 = ['name':'tom']
println map1 == map2
結果為true。但是你要運行下面的語句:
def map1 = ['name':'tom']
def map3 = ['name':'alice']
println map1 == map3
結果卻是false了,原因很簡單:map1和map2的key為“name”時,value卻不同。
你可能要問,既然“==”符號是判斷兩個對象的內容是否相同,那麼用什麼來判斷兩個對象的引用是否相同呢?
其實很簡單,在Groovy語言中,我們使用is方法來判斷兩個對象的引用是否相同。如:
def list1 = [1]
def list2 = [1]
println list1.is(list2)
你可能想象得到,上面的語句運行結果為false。
但是,如果是下面的語句:
def list1 = [1]
def list2 = [1]
list2 = list1
println list1.is(list2)
聰明的你一定知道,運行結果為true。
但是你看看下面的語句:
def abc1 = 'abc'
def abc2 = "abc"
println abc1.is(abc2)
猜猜它的運行結果是什麼?
是的,結果為true。
Stop!你剛剛不是說了,判斷兩個對象的引用是否相同使用“==”符號啊,現在abc1和abc2是兩個引用啊。
不錯,abc1和abc2是兩個引用,但是是兩個相同的引用,都指向同一個對象“abc”。在聲明def abc1 = 'abc'時,系統會生成一個“abc”對象,同時將引用abc1指向該對象;但是,在聲明def abc2 = "abc"時,系統不再生成新的“abc”對象,而是直接將引用abc2指向上面已經生成了的“abc”對象。所以abc1和abc2指向同一個對象。
如果你還沒有想清楚,請結合下面的例子再想一想:
String a1 = new String('a')
String a2 = "a"
println a1.is(a2)
是的,結果為false。
對於new String(),系統永遠為它生成新的對象。