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.
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.
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.
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.
Vous pourriez faire ceci:
String.format("%s %s", client.firstName, client.lastName)