Sobes.tech
Middle+

A cosa serve il modificatore `crossinline` in Kotlin?

sobes.tech AI

Risposta dell'AI

Il modificatore crossinline viene utilizzato per contrassegnare i parametri lambda delle funzioni inline.

Indica al compilatore che la lambda corrispondente non può effettuare un ritorno non locale (non-local return), cioè usare l'istruzione return per uscire dalla funzione esterna. Tuttavia, la lambda può ancora essere inserita (inlined) nel punto della chiamata.

Esempio:

// Funzione inline normale con ritorno non locale
inline fun runTask(task: () -> Unit) {
    task() // È possibile un ritorno non locale da task()
    println("Task completato")
}

// Funzione inline con parametro crossinline
inline fun runSafeTask(crossinline task: () -> Unit) {
    // Blocco try-finally come esempio, dove è necessario crossinline
    try {
        task() // NON è permesso fare un ritorno non locale da task()
    } finally {
        println("Pulizia")
    }
    println("Task sicuro completato")
}

fun main() {
    // Uso di runTask
    runTask {
        println("Dentro la lambda di runTask")
        return // PERMESSO: ritorno non locale da main()
    }
    // La stampa "Task completato" NON sarà eseguita

    // Uso di runSafeTask
    runSafeTask {
        println("Dentro la lambda di runSafeTask")
        // return // ERRORE DI COMPILAZIONE: ritorno non locale proibito
    }
    println("Dopo il task sicuro") // Questa stampa sarà eseguita
}

Quando è utile:

  • Quando si vuole garantire che il codice dopo la chiamata alla lambda crossinline venga eseguito (ad esempio, in blocchi try-finally).
  • Quando la lambda viene passata come argomento a un'altra funzione che potrebbe non essere inline, e si desidera impedire un ritorno non locale che potrebbe interrompere il flusso di esecuzione.