Sobes.tech
Middle+

La ce se folosește modificatorul `crossinline` în Kotlin?

sobes.tech AI

Răspuns de la AI

Modificatorul crossinline este utilizat pentru a marca parametrii lambda ai funcțiilor inline.

Indică compilatorului că lambda corespunzătoare nu poate efectua o returnare non-locală (non-local return), adică să folosească instrucțiunea return pentru a ieși din funcția externă. Cu toate acestea, lambda poate fi încă inserată (inlined) în locul apelului.

Exemplu:

// Funcție inline normală cu returnare non-locală
inline fun runTask(task: () -> Unit) {
    task() // Returnarea non-locală este posibilă din task()
    println("Sarcină finalizată")
}

// Funcție inline cu parametru crossinline
inline fun runSafeTask(crossinline task: () -> Unit) {
    // Bloc try-finally ca exemplu, unde este nevoie de crossinline
    try {
        task() // NU este permis să faci returnare non-locală din task()
    } finally {
        println("Curățare")
    }
    println("Sarcină sigură finalizată")
}

fun main() {
    // Utilizarea lui runTask
    runTask {
        println("În lambda-ul lui runTask")
        return // PERMIS: returnare non-locală din main()
    }
    // Se va afișa "Sarcină finalizată" NU

    // Utilizarea lui runSafeTask
    runSafeTask {
        println("În lambda-ul lui runSafeTask")
        // return // EROARE DE COMPILARE: returnare non-locală interzisă
    }
    println("După sarcina sigură") // Această linie va fi executată
}

Când este util:

  • Când vrei să te asiguri că codul după apelul lambda-ului crossinline va fi executat (de exemplu, în blocuri try-finally).
  • Când lambda este transmisă ca argument altor funcții care poate nu sunt inline, și vrei să previi o returnare non-locală care ar putea întrerupe fluxul de execuție.