Middle+
Wofür wird das Schlüsselwort crossinline in Kotlin verwendet?
sobes.tech KI
Antwort von AI
crossinline wird in Kotlin verwendet, um Parameter von Funktionen in Inline-Funktionen zu kennzeichnen. Dadurch kann eine solche Lambda-Parameter innerhalb verschachtelter Funktionen (wie anonymen Klassenobjekten) aufgerufen werden, die nicht inline sind.
Normale Lambdas in Inline-Funktionen können nicht lokale Rückgaben enthalten (Rückgaben, die aus der äußeren Funktion aussteigen). Ein mit crossinline gekennzeichnetes Lambda kann keine nicht lokalen Rückgaben enthalten.
Hauptzweck:
- Ermöglichen, ein Lambda in Kontexten zu verwenden, in denen ein standardmäßiges Inline-Lambda (mit der Möglichkeit eines nicht lokalen Rückgabes) nicht verwendet werden kann (z.B. anonyme Objekte, lokale Funktionen).
- Nicht lokale Rückgaben aus dem Lambda verhindern, wenn dies unerwünscht oder aufgrund der Code-Struktur unmöglich ist (z.B. beim Übergabe eines Lambdas an einen anderen Thread).
Beispiel:
inline fun runAsyncAndFinish(crossinline block: () -> Unit) {
// Erstellen eines anonymen Runnable-Objekts
val runnable = object : Runnable {
override fun run() {
block() // Verwendung des crossinline-Lambdas innerhalb
// hier kann block() keinen nicht lokalen Rückgabewert aus runAsyncAndFinish haben
}
}
// Ausführen in einem separaten Thread (Beispiel)
Thread(runnable).start()
// Wenn block kein crossinline wäre, könnte block() einen Rückgabewert aus runAsyncAndFinish auslösen
// was aus einem anderen Thread als dem aufrufenden nicht möglich ist
}
fun testCrossinline() {
println("Vor runAsyncAndFinish")
runAsyncAndFinish {
println("Innerhalb des asynchronen Blocks")
// return // Kompilierungsfehler: Nicht-lokale Rückgabe mit crossinline nicht erlaubt
}
println("Nach runAsyncAndFinish")
}