Sobes.tech
Middle+

Wofür wird der Modifikator `crossinline` in Kotlin verwendet?

sobes.tech KI

Antwort von AI

Der Modifikator crossinline wird verwendet, um Lambda-Parameter von Inline-Funktionen zu kennzeichnen.

Er weist den Compiler an, dass die entsprechende Lambda-Funktion keinen nicht-lokalen Rückkehr (non-local return) durchführen kann, also das return-Statement verwenden, um die äußere Funktion zu verlassen. Die Lambda kann jedoch weiterhin an der Stelle des Aufrufs inline eingefügt werden (inlined).

Beispiel:

// Normale inline-Funktion mit nicht-lokaler Rückkehr
inline fun runTask(task: () -> Unit) {
    task() // Nicht-lokale Rückkehr aus task() ist möglich
    println("Aufgabe beendet")
}

// inline-Funktion mit crossinline-Parameter
inline fun runSafeTask(crossinline task: () -> Unit) {
    // try-finally-Block als Beispiel, bei dem crossinline benötigt wird
    try {
        task() // Nicht-lokale Rückkehr aus task() ist NICHT erlaubt
    } finally {
        println("Aufräumen")
    }
    println("Sichere Aufgabe beendet")
}

fun main() {
    // Verwendung von runTask
    runTask {
        println("Innerhalb der runTask-Lambda")
        return // ERLAUBT: nicht-lokale Rückkehr aus main()
    }
    // Der Druck "Aufgabe beendet" wird NICHT ausgeführt

    // Verwendung von runSafeTask
    runSafeTask {
        println("Innerhalb der runSafeTask-Lambda")
        // return // KOMPILIERFEHLER: nicht-lokale Rückkehr verboten
    }
    println("Nach der sicheren Aufgabe") // Dieser Druck wird ausgeführt
}

Wann ist das nützlich:

  • Wenn garantiert werden soll, dass der Code nach dem Aufruf der crossinline-Lambda ausgeführt wird (z.B. in try-finally-Blöcken).
  • Wenn die Lambda als Argument an eine andere Funktion übergeben wird, die möglicherweise nicht inline ist, und man eine nicht-lokale Rückkehr verhindern möchte, die den Ablauf stören könnte.