Groovy GStringImpl и поведение String
Я недавно читал о поведении GStringImpl
с против String
s при использовании в коллекциях в 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.