web-dev-qa-db-fra.com

Comment fonctionne l'interpolation de chaîne dans Kotlin?

Le compilateur Kotlin traduit-il "Hello, $name!" en utilisant quelque chose comme:

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

ou existe-t-il un autre mécanisme?

Et si j'ai un cours comme celui-ci par exemple:

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

Ce getter renverra-t-il une chaîne en cache ou tentera-t-il de construire une nouvelle chaîne? Devrais-je utiliser lazyOf delegate à la place?

Je sais qu’il n’y aura pas de problème de performances sauf s’il y aura des millions d’appels à fullName, mais je n’ai pas trouvé de documentation sur cette fonctionnalité, sauf sur son utilisation.

21
meztihn

Le compilateur Kotlin traduit ce code en:

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

Aucune mise en cache n'est effectuée: chaque fois que vous évaluez une expression contenant un modèle de chaîne, la chaîne résultante sera reconstruite.

27
yole

En ce qui concerne votre deuxième question: Si vous avez besoin d'encaisser pour fullName, vous pouvez et devriez le faire explicitement:

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

Ce code est équivalent à votre capture, sauf que le getter sous-jacent getFullName() utilise désormais un champ privé final avec le résultat de la concaténation.

9
voddan

Comme vous le savez, en interpolation de chaîne, les littéraux de chaîne contenant des espaces réservés sont évalués, ce qui donne un résultat dans lequel les espaces réservés sont remplacés par leurs valeurs correspondantes.

var age = 21

println("My Age Is: $age")

Rappelez-vous: le signe "$" est utilisé pour l'interpolation.

4
Anish Arya

Vous pourriez faire ceci:

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