Sobes.tech
Middle+

Waarvoor wordt het sleutelwoord crossinline gebruikt in Kotlin?

sobes.tech AI

Antwoord van AI

crossinline wordt in Kotlin gebruikt om parameters van functies in inline-functies te markeren. Dit stelt je in staat om zo'n lambda-parameter binnen geneste functies (zoals anonieme klasse-objecten) aan te roepen die niet inline zijn.

Normale lambdas in inline-functies kunnen niet-lokale terugroepen bevatten (terugroepen die uit de externe functie komen). Een met crossinline gemarkeerde lambda kan geen niet-lokale terugroepen bevatten.

Hoofddoel:

  • Het mogelijk maken om een lambda te gebruiken in contexten waar een standaard inline-lambda (met de mogelijkheid tot niet-lokale terugroep) niet kan worden gebruikt (bijvoorbeeld anonieme objecten, lokale functies).
  • Niet-lokale terugroepen uit de lambda voorkomen wanneer dit ongewenst of onmogelijk is vanwege de structuur van de code (bijvoorbeeld bij het doorgeven van een lambda aan een andere thread).

Voorbeeld:

inline fun runAsyncAndFinish(crossinline block: () -> Unit) {
    // Aanmaken van een anoniem Runnable-object
    val runnable = object : Runnable {
        override fun run() {
            block() // Gebruik van crossinline lambda binnenin
            // hier kan block() geen niet-lokaal terugroep doen vanuit runAsyncAndFinish
        }
    }
    // Uitvoeren in een aparte thread (voorbeeld)
    Thread(runnable).start()
    // als block niet crossinline was, kon block() een return doen vanuit runAsyncAndFinish
    // wat niet mogelijk is vanuit een andere thread dan de aanroepende
}

fun testCrossinline() {
    println("Voor runAsyncAndFinish")
    runAsyncAndFinish {
        println("Binnen asynchrone blok")
        // return // Compileerfout: niet-lokaal return niet toegestaan met crossinline
    }
    println("Na runAsyncAndFinish")
}