Groovy GStringImpl и поведение String

Я недавно читал о поведении GStringImplс против Strings при использовании в коллекциях в Groovy.

Я понимаю, что причина этого оценивается как ложная...

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

связано с требованием симметрии .equals() контракт, однако мне было интересно, если была причина GStringImpl нельзя просто оценить String немедленно. Поэтому, когда я делаю что-то вроде этого...

"${'someString'}"

Я не понимаю GStringImplЯ просто получаю простую Java String назад, который я могу сразу же использовать в качестве ключа на карте, например.

Я знаю, что есть некоторые обходные пути, такие как

String s = "${'someString'}"

Однако такие вещи, как это немного неудобно, и путаница между GStringImpl а также String Кажется, это большая проблема для новичков Groovy.

1 ответ

Решение

GStrings не оцениваются непосредственно в String по ряду причин, в основном связанных с отложенной оценкой (что очень хорошо для регистрации) и шаблонизацией. В Strings и GString вы можете найти хорошее объяснение:

GString может включать в себя ленивую оценку, поэтому только когда вызывается метод toString(), вычисляется GString. Эта ленивая оценка полезна для таких вещей, как ведение журнала, так как она позволяет вычислять строку, вызывать toString() для значений и объединять различные строки, если вообще делать, лениво.

GString очень удобен, когда вы не хотите использовать шаблонизатор или когда вам действительно нужна полная ленивая оценка GStrings. Когда некоторая переменная встроена в GString, для этой строчки вызывается toString(), чтобы получить строковое представление, и она вставляется в окончательную строку.

Следовательно:

GString и String - это два разных класса, и, следовательно, использование объектов GString в качестве ключей для объектов Map или сравнений, включающих объекты GString, может привести к неожиданным результатам в сочетании с объектами String, поскольку GString и String не будут иметь одинаковый hashCode и не будут быть равным Не существует автоматического приведения между этими двумя типами для сравнения или ключей карты, поэтому иногда необходимо явно вызывать toString() для объектов GString.

Неожиданное преобразование в String может привести к проблемам, когда код ожидает GString, как для методов в классах groovy.sql.

Другие вопросы по тегам