Как работает интерполяция строк в Котлин?

Компилятор Kotlin переводит "Hello, $name!", используя что-то вроде

java.lang.String.format("Hello, %s!", name)

или есть какой-то другой механизм?

И если у меня есть такой класс, например:

class Client {
  val firstName: String
  val lastName: String
  val fullName: String
    get() = "$firstName $lastName"
}

Будет ли этот метод получения возвращать кэшированную строку или попытаться создать новую строку? Стоит ли использовать вместо этого делегат lazyOf?

Я знаю, что не будет проблем с производительностью, если не будут миллионы звонков в fullName, но я не нашел документации об этой функции, за исключением того, как ее использовать.

Ответ 1

Компилятор Kotlin переводит этот код на:

new StringBuilder().append("Hello, ").append(name).append("!").toString()

Не выполняется кэширование: каждый раз, когда вы оцениваете выражение, содержащее строковый шаблон, результирующая строка будет построена снова.

Ответ 2

По поводу вашего второго вопроса: Если вам нужно кэширование для fullName, вы можете и должны сделать это явно:

class Client {
    val firstName: String
    val lastName: String
    val fullName = "$firstName $lastName"
}

Этот код эквивалентен вашему фрагменту, за исключением того, что базовый метод получения getFullName() теперь использует последнее закрытое поле с результатом конкатенации.

Ответ 3

Как вы знаете, в строковой интерполяции строковые литералы, содержащие заполнители, оцениваются, что дает результат, в котором заполнители заменяются соответствующими значениями. поэтому интерполяция (в KOTLIN) идет следующим образом:

var age = 21

println("My Age Is: $age")

Помните: для интерполяции используется знак "$".

Ответ 4

Вы можете сделать это:

String.format("%s %s", client.firstName, client.lastName)