Historique de la question :
En Kotlin, l'accès aux propriétés se fait par le biais de méthodes getters et setters. Pour améliorer les performances, les développeurs ont ajouté le modificateur inline aux accessors, permettant à la JVM d'optimiser les appels lors de la compilation en insérant directement le corps du get/set dans le code appelant.
Problème :
Les méthodes accessor normales sont créées pour chaque propriété, ce qui augmente les coûts d'appel (surtout lors d'appels fréquents). Parfois, les développeurs utilisent la logique externe dans un get/set séparé, mais souhaitent éviter le surcoût d'un appel de fonction.
Solution :
Utilisez le modificateur inline avec le getter ou le setter si leur implémentation est courte et qu'il n'y a pas de code lourd. Cela réduit les coûts, surtout dans les hot-path. Notez que l'inlining fonctionne uniquement pour les propriétés de niveau supérieur et les propriétés dans des objets compagnons et des objets object, et non dans des classes normales en raison des principes d'héritage de la JVM.
Exemple de code :
inline var Int.asHex: String get() = Integer.toHexString(this) set(value) {} inline val String.firstUpperCase: String get() = if (isEmpty()) this else this[0].uppercase() + substring(1)
Caractéristiques clés :
Peut-on utiliser des accessors inline avec des propriétés de classes normales ?
Non, l'inlining pour les getters et setters est permis uniquement pour les propriétés de niveau supérieur ou d'objet (y compris les objets compagnons), et non pour les propriétés dans les classes, afin d'éviter des problèmes d'héritage.
L'accès au champ de support (backing field) est-il disponible dans l'accessor inline ?
Non, l'accessor inline n'a pas de champ de support, tenter d'y accéder déclenchera une erreur de compilation.
L'inlining d'un accessor influence-t-il toujours le bytecode ?
L'inlining ne suggère que la possibilité pour le compilateur d'intégrer le code. Le compilateur JIT peut ignorer cela dans certains cas. De plus, si l'accessor contient une logique lourde, l'effet obtenu peut être inverse.
Dans le projet, une grande propriété a été déclarée inline, mais dans le getter, un lourd traitement est effectué, utilisé dans une boucle. Résultat — le bytecode final devient gonflé, le JIT désactive l'inlining, la performance chute.
Avantages :
Inconvénients :
Une val inline a été déclarée pour la conversion d'un nombre en chaîne. Le getter est appelé fréquemment dans le code UI. Les performances sont restées élevées, le bytecode est compact.
Avantages :
Inconvénients :