Middle+
Mit használ a crossinline kulcsszó Kotlinban?
sobes.tech MI
Válasz az MI-től
A crossinline a Kotlinban arra használatos, hogy megjelölje a függvényparamétereket inline függvényekben. Ez lehetővé teszi, hogy ilyen lambda paramétert belső függvényekben (például névtelen osztályobjektumokban) hívjunk, amelyek nem inline-ok.
A normál lambda-ok inline függvényekben tartalmazhatnak nem helyi visszatéréseket (kifelé irányuló visszatérések). A crossinline-nal jelölt lambda nem tartalmazhat ilyen nem helyi visszatérést.
Fő cél:
- Lehetővé tenni egy lambda használatát olyan kontextusokban, ahol az alapértelmezett inline lambda (nem helyi visszatéréssel) nem használható (például névtelen objektumok, helyi függvények).
- Megakadályozni a nem helyi visszatéréseket a lambdából, amikor ez nem kívánatos vagy lehetetlen a kód szerkezete miatt (például, amikor egy lambda-t másik szálon adunk át).
Példa:
inline fun runAsyncAndFinish(crossinline block: () -> Unit) {
// Névtelen Runnable objektum létrehozása
val runnable = object : Runnable {
override fun run() {
block() // crossinline lambda használata belül
// itt a block() nem hajthat végre nem helyi visszatérést a runAsyncAndFinish-ből
}
}
// Elindítás külön szálon (példa)
Thread(runnable).start()
// ha a block nem crossinline, akkor a block() végrehajthatna visszatérést a runAsyncAndFinish-ből
// ami nem lehetséges egy másik szálról, mint ahonnan hívják
}
fun testCrossinline() {
println("RunAsyncAndFinish előtt")
runAsyncAndFinish {
println("Aszinkron blokk belseje")
// return // Fordítási hiba: nem megengedett nem helyi visszatérés crossinline-nal
}
println("RunAsyncAndFinish után")
}