Sobes.tech
Middle+

Para que é que é utilizado o modificador `crossinline` em Kotlin?

sobes.tech IA

Resposta da IA

O modificador crossinline é utilizado para marcar os parâmetros lambda de funções inline.

Indica ao compilador que a lambda correspondente não pode realizar um retorno não local (non-local return), ou seja, usar a instrução return para sair da função externa. No entanto, a lambda ainda pode ser inserida (inlined) no local da chamada.

Exemplo:

// Função inline normal com retorno não local
inline fun runTask(task: () -> Unit) {
    task() // Retorno não local possível de task()
    println("Tarefa finalizada")
}

// Função inline com parâmetro crossinline
inline fun runSafeTask(crossinline task: () -> Unit) {
    // Bloco try-finally como exemplo, onde é necessário crossinline
    try {
        task() // NÃO é permitido fazer retorno não local de task()
    } finally {
        println("Limpeza")
    }
    println("Tarefa segura finalizada")
}

fun main() {
    // Uso de runTask
    runTask {
        println("Dentro da lambda de runTask")
        return // PERMITIDO: retorno não local de main()
    }
    // A impressão "Tarefa finalizada" NÃO será executada

    // Uso de runSafeTask
    runSafeTask {
        println("Dentro da lambda de runSafeTask")
        // return // ERRO DE COMPILAÇÃO: retorno não local proibido
    }
    println("Depois da tarefa segura") // Esta impressão será executada
}

Quando é útil:

  • Quando é necessário garantir que o código após a chamada à lambda crossinline seja executado (por exemplo, em blocos try-finally).
  • Quando a lambda é passada como argumento para outra função que pode não ser inline, e você deseja evitar um retorno não local que possa interromper o fluxo de execução.