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对象声明为String,String updateStr = "${selectSql} for update"
后来在Groovy的官方网站上查到了这个问题,但上面仍然说明为什么Gstring在Gsql中会出问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值