В Grails и Groovy строки (в одинарных кавычках) превосходят GString?

Поскольку в Grails и Groovy строки в одинарных кавычках относятся к классу, отличному от класса GString (строки в двойных кавычках позволяют вводить значение ${variable}), более эффективно ли использовать одинарные кавычки, за исключением случаев, когда используются ${variables}? Я предполагаю, что наличие двойных кавычек потребует синтаксического анализа строки, который не потребуется для обычной строки с одинарными кавычками. Поэтому я ожидаю очень небольшого снижения производительности из-за дополнительного времени на поиск наличия ${}.

Таким образом, может показаться, что в целом было бы полезно иметь соглашение, поощряющее использование одинарных кавычек, если только нет особого преимущества в использовании двойных кавычек. Я не в теме?


person TriumphST    schedule 11.03.2016    source источник


Ответы (2)


эффективнее ли использовать одинарные кавычки, за исключением случаев, когда используются ${переменные}?

Нет. В сценарии, где ${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 ", "" });
}
person Jeff Scott Brown    schedule 11.03.2016
comment
Я понимаю, что строки без ${variable} рассматриваются как класс String, но мой вопрос больше направлен на то, что происходит ДО того, как он будет идентифицирован как String. Разве нет процесса синтаксического анализа, который должен определить, какой класс использовать, который НЕ требуется для строки с одинарными кавычками? Если да, то происходит ли этот дополнительный синтаксический анализ во время компиляции или во время выполнения. Если во время выполнения, то я бы ожидал небольшой удар по производительности... - person TriumphST; 14.03.2016
comment
@TriumphST Я ответил на ваш вопрос в отредактированном ответе выше. - person Jeff Scott Brown; 14.03.2016

Взгляните на первое примечание в разделе строка в двойных кавычках. .

Строки в двойных кавычках являются простыми 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, пока не произойдет интерполяция (как в третьем утверждении).

Таким образом, не имеет значения, используются ли одинарные или двойные кавычки, пока отсутствует интерполяция. Однако лично я не думаю, что следует беспокоиться о повышении производительности при использовании String или GString.

person dmahapatro    schedule 11.03.2016