ProgrammationDéveloppeur Backend Kotlin

Qu'est-ce que les fonctions inline en Kotlin, comment affectent-elles les performances et quand est-il judicieux de les utiliser ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

Les fonctions inline en Kotlin sont définies à l'aide du mot-clé inline et demandent au compilateur de "substituer" le corps de la fonction directement aux endroits où elle est appelée. Cela réduit les coûts d'appel de fonction, en particulier lorsque des lambdas ou de courtes fonctions sont utilisées, et élimine l'allocation d'objets supplémentaires pour capturer des fermetures.

Exemple :

def inline fun synchronized(lock: Any, block: () -> Unit) { kotlin.synchronized(lock) { block() } }

Les principaux avantages :

  • Réduction des frais généraux liés aux appels de fonctions
  • Possibilité d'éviter l'allocation de foncteurs-lambdas

Inconvénients :

  • Augmentation de la taille du bytecode (le code est dupliqué)
  • Non recommandé pour de grandes fonctions

Recommandation : Utilisez inline lorsque vous devez améliorer les performances sur des sections critiques du code où les lambdas sont largement utilisées.

Question piège

Quelle est la limitation des fonctions inline lors de l'utilisation de types d'arguments reified ?

Réponse incorrecte courante : "Les types reifiés sont toujours accessibles à l'intérieur de n'importe quelle fonction inline."

Réponse correcte : Seules les fonctions inline peuvent utiliser le modificateur reified dans la déclaration des génériques, permettant d'accéder au type à l'exécution :

inline fun <reified T> getTypeName() = T::class.java.name

Dans une fonction générique ordinaire, l'accès au type T pendant l'exécution ne sera pas possible.

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet


Histoire

Mauvaise utilisation de inline ayant conduit à un APK gonflé : Dans une équipe d'un projet Android, les développeurs ont marqué des dizaines de fonctions utilitaires comme inline, y compris des fonctions avec de gros corps complexes. En conséquence, la taille de l'APK a augmenté de près de 2 Mo en raison de la duplication des fonctions dans tous les endroits d'appel.


Histoire

Erreur avec des lambdas et l'accès à des variables privées : Utilisation d'une fonction inline avec une lambda, à l'intérieur de laquelle l'accès à des membres privés de la classe était réalisé. Après avoir déplacé la fonction dans un module externe, le code a cessé de se compiler (privilèges violés), ce qui n'a été découvert qu'en CI.


Histoire

Utilisation de reified en dehors d'une fonction inline : L'un des développeurs a tenté de déclarer une fonction avec un paramètre générique reified sans modificateur inline. Le code ne compilait pas, ce qui a conduit à une longue enquête de la part d'un novice sur la raison pour laquelle "T::class" n'était pas accessible en dehors des fonctions inline.