Sobes.tech
Middle+

Waarvoor wordt de `crossinline` modifier gebruikt in Kotlin?

sobes.tech AI

Antwoord van AI

De crossinline modifier wordt gebruikt om lambda-parameters van inline-functies te markeren.

Het geeft de compiler aan dat de betreffende lambda geen non-local return mag uitvoeren, dat wil zeggen, geen return-statement mag gebruiken om uit de externe functie te vertrekken. De lambda kan echter nog steeds inline worden geplaatst (inlined) op de aanroeplocatie.

Voorbeeld:

// Normale inline-functie met non-local return
inline fun runTask(task: () -> Unit) {
    task() // Non-local return vanuit task() is mogelijk
    println("Taak voltooid")
}

// inline-functie met crossinline-parameter
inline fun runSafeTask(crossinline task: () -> Unit) {
    // try-finally blok als voorbeeld, waar crossinline nodig is
    try {
        task() // Het is NIET toegestaan om een non-local return uit task() te doen
    } finally {
        println("Opruimen")
    }
    println("Veilige taak voltooid")
}

fun main() {
    // Gebruik van runTask
    runTask {
        println("Binnen lambda van runTask")
        return // TOEGESTAAN: non-local return uit main()
    }
    // De print "Taak voltooid" wordt NIET uitgevoerd

    // Gebruik van runSafeTask
    runSafeTask {
        println("Binnen lambda van runSafeTask")
        // return // FOUT VAN COMPILER: non-local return verboden
    }
    println("Na de veilige taak") // Deze print wordt uitgevoerd
}

Wanneer is dit nuttig:

  • Wanneer je wilt garanderen dat de code na de aanroep van de crossinline lambda wordt uitgevoerd (bijvoorbeeld in try-finally blokken).
  • Wanneer de lambda als argument wordt doorgegeven aan een andere functie die mogelijk niet inline is, en je een non-local return wilt voorkomen die de uitvoering kan verstoren.