Groovy語言裡有很多看起來不起眼的小玩意,但使用以後,我們卻常常會驚異於它的巨大能量,Gstring就是其中之一。
Java的String對象是我們最最常用的對象,卻也是诟病最多的對象。一句話來說,String使用起來非常不方便。而Gstring不但使用方便,而且更是Groovy語言動態性的基礎。
所謂Gstring,是指通過雙引號引起來的、帶有占位表達式的字符串,如:def str = “${name}’s dog is ${dog.name}”,其中由美元符號括起來的部分就是占位表達式,而str就是一個Gstring對象。
這裡試著列出其中的一些常用方法。
1.字符串疊加
Java String類型的字符串疊加是通過String對象相加運算完成的,其形式如下:
def result = name+” is ”+age+” years old”;
這種形式的字符串相加使得我們在編碼的時候非常不方便,而Gstring則不同了,它可以使我們非常方便的編碼,形式如下:
def result = “$name is $age years old”;
2.方便字符串與函數的運算
在編碼的過程中,我們經常會將表達式結果和字符串一起運算,Gstring可以使我們在這樣的計算方面更加方便和輕巧。請看下面的例子:
def result = “key: person.name value: ${map[‘person.name’]}”
def result = “${book?.author?.name}”
等等
3.Gstring的動態性
Groovy語言編程有著良好的動態性,可以使得我們寫出十分優雅的底層抽象代碼。而Gstring則是這種動態性編程的基礎。
在反射方面,使用Gstring可以十分方便的對一個類的屬性和方法進行訪問。如下:
假設我們有一個Person類
class Person
{
String name
}
下面我們通過Gstring對象就可以對Person的對象的屬性進行操作了。
String propName = ‘name’;
Person p = new Person()
p.”${ propName }” = ‘tom’
println p.”${propName}”
同樣,通過Gstring對象,我們也可以十分方便對對象的方法進行操作,如下:
我們假設上面的Person類有一個toString()方法。
public String toString()
{
return name
}
那麼,我們就可以對該方法進行如下的操作。
String functionName = “toString”
Person p = new Person()
p.name = “mike”
println p.”${functionName}”()
在正則表達式方面,我們也可以使用Gstring對象對正則表達式進行運行時的替換,這也是Gstring所做的一個有意思的工作,如下:
def reference = “pattern”
println reference == /${reference}/
如果Gstring對象所引用的是一個對象,那麼需要注意的是該Gstring對象的值等於運行時它所引用的對象的值;換句話說,該Gstring對象的值是可能變化的。具體說來就是隨著它引用的那個對象變化而變化。下面給出一個例子。
還是Person類為例:
class Person
{
String name
public String toString()
{
return name
}
}
很簡單的一個類,下面我們對該類進行操作:
Person p = new Person()
p.name = ‘tom’
def str = “${p}”
println str
p.name = ‘mike’
println str
運行上面的代碼,我們可以看到,打印的第一行為:tom,而第二行卻是:mike。就是因為str這個Gstring對象引用的是p這個Person對象,而這個對象是可能隨時變化的。
4.Gstring在Gsql中的問題
Gstring使用非常方便,我們在使用Groovy語言的時候,肯定會自覺不自覺的大量使用它。需要注意的是,雖然它很方便,但是在使用的過程中仍然會遇到問題。下面一個例子是我在對Oracle Blob字段進行操作時候遇到了,當時就郁悶了一段時間。
def selectSql = "select other from tran where id = '5'"
def updateStr = "${selectSql} for update"
def row = sql.firstRow(updateStr)
運行上面的代碼時,結果就報錯了。解決的方法有兩個:
一是不使用Gstring,def updateStr = selectSql+' for update'
二是將updateStr對象聲明為String,String updateStr = "${selectSql} for update"
後來在Groovy的官方網站上查到了這個問題,但上面仍然說明為什麼Gstring在Gsql中會出問題。