Sobes.tech
Middle+

Para que é que é utilizado a palavra-chave crossinline em Kotlin?

sobes.tech IA

Resposta da IA

O crossinline é usado em Kotlin para marcar parâmetros de funções em funções inline. Isto permite chamar esse parâmetro lambda dentro de funções aninhadas (como objetos de classes anónimas) que não são inline.

Os lambdas normais em funções inline podem conter retornos não locais (retornos que saem da função externa). Um lambda marcado com crossinline não pode conter retornos não locais.

Propósito principal:

  • Permitir usar um lambda em contextos onde um lambda inline por padrão (com a capacidade de retorno não local) não pode ser utilizado (por exemplo, objetos anónimos, funções locais).
  • Impedir retornos não locais do lambda quando isso não é desejável ou possível devido à estrutura do código (por exemplo, ao passar um lambda para outra thread).

Exemplo:

inline fun runAsyncAndFinish(crossinline block: () -> Unit) {
    // Criar um objeto anónimo Runnable
    val runnable = object : Runnable {
        override fun run() {
            block() // Uso do lambda crossinline dentro
            // aqui block() não pode fazer um retorno não local de runAsyncAndFinish
        }
    }
    // Executar numa thread separada (exemplo)
    Thread(runnable).start()
    // se block não fosse crossinline, block() poderia fazer um return de runAsyncAndFinish
    // o que não é possível de uma thread diferente da que chamou
}

fun testCrossinline() {
    println("Antes de runAsyncAndFinish")
    runAsyncAndFinish {
        println("Dentro do bloco assíncrono")
        // return // Erro de compilação: não é possível usar return não local com crossinline
    }
    println("Depois de runAsyncAndFinish")
}