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")
}