Sobes.tech
Middle+

À quoi sert le mot-clé crossinline en Kotlin?

sobes.tech IA

Réponse de l'IA

crossinline est utilisé en Kotlin pour marquer les paramètres de fonction dans les fonctions inline. Cela permet d'appeler ce paramètre lambda à l'intérieur de fonctions imbriquées (comme des objets de classes anonymes) qui ne sont pas inline.

Les lambdas normaux dans les fonctions inline peuvent contenir des retours non locaux (retours sortant de la fonction externe). Un lambda marqué avec crossinline ne peut pas contenir de retours non locaux.

Objectif principal :

  • Permettre d'utiliser un lambda dans des contextes où un lambda inline par défaut (avec la possibilité de retour non local) ne peut pas être utilisé (par exemple, objets anonymes, fonctions locales).
  • Empêcher les retours non locaux depuis le lambda lorsque cela est indésirable ou impossible en raison de la structure du code (par exemple, lors du passage d'un lambda à un autre thread).

Exemple :

inline fun runAsyncAndFinish(crossinline block: () -> Unit) {
    // Création d'un objet Runnable anonyme
    val runnable = object : Runnable {
        override fun run() {
            block() // Utilisation du lambda crossinline à l'intérieur
            // ici block() ne peut pas effectuer de retour non local depuis runAsyncAndFinish
        }
    }
    // Lancer dans un thread séparé (exemple)
    Thread(runnable).start()
    // si block n'était pas crossinline, block() pourrait faire un return depuis runAsyncAndFinish
    // ce qui est impossible depuis un thread différent de celui qui appelle
}

fun testCrossinline() {
    println("Avant runAsyncAndFinish")
    runAsyncAndFinish {
        println("À l'intérieur du bloc asynchrone")
        // return // Erreur de compilation : impossible d'utiliser un return non local avec crossinline
    }
    println("Après runAsyncAndFinish")
}