Groovy GStringImpl和String行为

时间:2013-09-24 07:29:00

标签: string groovy equality

我最近在阅读Groovy中的集合中使用GStringImpl s vs String时的行为。

我理解这个评价为假的原因......

"${'test'}".equals("test") == false

是由.equals()合同的对称性要求引起的,但是我想知道是否有理由不能立即将GStringImpl评估为String。所以当我做这样的事情时......

"${'someString'}"

我没有得到GStringImpl,我只得到一个简单的Java String,例如,我可以立即将其用作地图中的关键字。

我知道有一些解决方法,比如

String s = "${'someString'}"

然而这样的事情有点不方便,GStringImplString之间的混淆似乎是Groovy新手的一大问题。

1 个答案:

答案 0 :(得分:20)

由于某些原因,

GStrings 不会立即评估为String,主要与延迟评估(对于日志记录非常有用)和模板有关。在Strings and GString中,您可以找到一个很好的解释:

  

GString可能涉及延迟评估,所以直到toString()   调用方法来评估GString 。这个懒惰的评价   对于像日志这样的东西很有用,因为它允许计算   string,对值的toString()调用以及连接   如果有的话,可以懒惰地完成不同的字符串。

     

当您不想使用模板引擎时,GString非常方便   或者当你真的想要对GStrings进行完全懒惰的评估时。当一些   嵌入在GString中的变量,在其上调用toString()   变量来获取字符串表示,并将其插入到   最后的字符串。

因此:

  

GString和String是两个不同的类,因此使用GString   对象作为Map对象的键或涉及GString的比较   对象,与String结合使用时会产生意外结果   对象,因为GString和String不具有相同的hashCode   他们会平等吗?两者之间没有自动强制   用于比较或映射键的类型,因此有时需要   在GString对象上显式调用toString()。

     

意外转换为String可能会导致代码出现问题   期待一个GString,就像groovy.sql类中的方法一样。