Sobes.tech
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")
}