3

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

因此,一般来说,鼓励使用单引号似乎是有益的,除非使用双引号有特定的优势。我不在基地吗?

4

2 回答 2

6

看一下Double Quoted String下的第一个注释。

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

这是可能的,因为插值是延迟检测的,因此确定是将其称为 GString 还是 String。例如尝试以下断言:

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

上面的第二个断言清楚地表明双引号是String默认的,直到有一个插值(如第三个断言)。

因此,只要不存在插值,使用单引号还是双引号都没有关系。但是,我个人认为在使用StringGString.

于 2016-03-11T01:24:10.140 回答
4

使用单引号是否更有效,除非使用 ${variables}?

否。对于使用 no 的场景${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 ", "" });
}
于 2016-03-11T12:24:27.540 回答