在Grails和Groovy中,字符串(在单引号中)是否优于GStrings



既然在Grails和Groovy中,单引号字符串与GStrings(允许${变量}值注入的双引号字符串)是不同的类,使用单引号是否更有效,除非使用${variables}? 我猜双引号的存在需要解析普通单引号字符串不需要的字符串。 因此,我预计额外时间寻找 ${} 的存在会受到非常轻微的性能影响。

因此,一般来说,制定一项鼓励使用单引号的约定似乎是有益的,除非使用双引号有特定的好处。 我离基地了吗?

查看双引号字符串下的第一个音符。

双引号字符串是纯java.lang.String如果没有 内插表达式,但如果是groovy.lang.GString实例,如果 存在插值。

这是可能的,因为插值是延迟检测到的,因此确定是将其称为 GString 还是字符串。例如,尝试在下面断言:

assert 'sample'.class.simpleName == 'String'
assert "sample".class.simpleName == 'String'
assert "sample ${1 != 2}".class.simpleName == 'GStringImpl'

上面的第二个断言清楚地表明,默认情况下String双引号,直到出现插值(如第三个断言)。

因此,只要不存在

插值,使用单引号还是双引号都无关紧要。但是,我个人认为不应该担心使用StringGString的规模的性能优势。

使用单引号是否更有效,除非 ${变量} 正在使用?

不。 对于不使用${variables}的方案,它们执行完全相同。 如果双引号字符串中没有${variables},则系统不会创建GString。 它创建了一个标准java.lang.String

编辑以解决下面评论中发布的单独问题:

它发生在编译时。 下面的代码:

void someMethod(String a) {
    def s1 = "some string"
    def s2 = "some string with arg ${a}"
}
@groovy.transform.CompileStatic
void someOtherMethod(String a) {
    def s1 = "some string"
    def s2 = "some string with arg ${a}"
}

编译成这样:

public void someMethod(String a)
{
    CallSite[] arrayOfCallSite = $getCallSiteArray();
    Object s1 = "some string";
    Object s2 = new GStringImpl(new Object[] { a }, new String[] { "some string with arg ", "" });
}
public void someOtherMethod(String a)
{
    String s1 = "some string";
    GString s2 = new GStringImpl(new Object[] { a }, new String[] { "some string with arg ", "" });
}

相关内容

  • 没有找到相关文章