Groovy探索之Gstring

                                      Groovy探索之Gstring
 
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对象声明为StringString updateStr = "${selectSql} for update"
后来在Groovy的官方网站上查到了这个问题,但上面仍然说明为什么GstringGsql中会出问题。
 
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页