0Pricing
Kotlin Academy · Aula

Modificadores noinline e crossinline

Controle o comportamento de inline para parâmetros lambda específicos em funções inline.

Modificadores noinline e crossinline é uma aula grátis de Kotlin Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Kotlin Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Kotlin Academy inclui 4 aulas no total.

O problema que inline resolve — e introduz

Quando uma função é inline, todos os seus parâmetros lambda são inseridos por padrão. Às vezes, é necessário que uma lambda específica não seja inserida — por exemplo, para armazená-la ou passá-la a outra função que não seja inline.

noinline: mantendo uma lambda como objeto

Prefixe um parâmetro lambda específico com noinline para excluí-lo da inserção em linha, mantendo os demais inseridos.

inline fun doWork(
    action: () -> Unit,
    noinline callback: () -> Unit   // stored, not inlined
) {
    action()                        // inlined at call site
    scheduleCallback(callback)      // passed as object — valid
}

Quando noinline é necessário

Você precisa usar noinline quando a lambda for:

  • Armazenada em uma variável ou campo
  • Passada para outra função que espera um tipo de função
  • Retornada pela função inline

crossinline: proibindo retornos não locais

crossinline é usado quando uma lambda inserida será chamada em um contexto de execução diferente (por exemplo, dentro de outra lambda ou em outra linha de execução). Ele informa ao compilador: insira esta lambda, mas não permita retornos não locais dentro dela.

inline fun runAsync(crossinline block: () -> Unit) {
    Thread {
        block()   // block is inlined but cannot use non-local return
    }.start()
}

Por que retornos não locais são perigosos aqui

Se block pudesse usar um return não local, ele tentaria retornar da função que chamou runAsync. Porém, quando a linha de execução fosse iniciada, essa função talvez já tivesse retornado — causando comportamento indefinido. crossinline impede isso durante a compilação.

Combinando noinline e crossinline

Uma única função inline pode combinar parâmetros regulares, noinline e crossinline:

inline fun orchestrate(
    crossinline setup: () -> Unit,
    action: () -> Unit,
    noinline teardown: () -> Unit
) {
    Thread { setup() }.start()
    action()
    register(teardown)
}

Erro do compilador sem crossinline

Se você passar uma lambda inserida para um contexto de lambda sem crossinline, o compilador emitirá: “Não é possível inserir 'block' aqui: ele pode conter retornos não locais. Adicione o modificador crossinline.”

Uso na biblioteca padrão

A biblioteca padrão usa crossinline em funções como Sequence { } e em alguns construtores de corrotinas, garantindo que a lambda fornecida pelo usuário seja executada com segurança em um contexto diferente.

noinline não interrompe inline

Marcar um parâmetro como noinline não desativa a inserção em linha da função inteira. O corpo da função e todos os demais parâmetros lambda continuam sendo inseridos. Apenas a lambda marcada com noinline mantém sua identidade de objeto.

Considerações de desempenho

noinline gera o custo usual de alocação de uma lambda para esse parâmetro. crossinline ainda insere a lambda — a única restrição é proibir retornos não locais. Nenhum dos modificadores afeta a inserção em linha dos outros parâmetros.

Tabela de resumo

Resumo dos modificadores:

  • Sem modificador → lambda totalmente inserida, com retornos não locais permitidos
  • noinline → lambda mantida como objeto, podendo ser armazenada ou passada
  • crossinline → lambda inserida, com retornos não locais proibidos

Verificação rápida

Quando é necessário usar noinline em um parâmetro lambda de uma função inline?

Recapitulação: noinline e crossinline

Principais conclusões:

  • noinline: mantém uma lambda como objeto dentro de uma função que, de resto, é inline
  • crossinline: insere a lambda, mas proíbe retornos não locais para permitir o uso seguro entre contextos
  • Ambos os modificadores se aplicam por parâmetro, não à função inteira

Perguntas Frequentes

A aula “Modificadores noinline e crossinline” é grátis?

Sim — o texto completo de “Modificadores noinline e crossinline” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Kotlin Academy, atualize para CoddyKit PRO. O curso de Kotlin Academy inclui 4 aulas no total.

O que vou aprender em “Modificadores noinline e crossinline”?

Controle o comportamento de inline para parâmetros lambda específicos em funções inline. Você pratica Kotlin Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Kotlin Academy?

Nenhuma experiência prévia é necessária. Kotlin Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Modificadores noinline e crossinline”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Kotlin Academy?

Sim. Cada aula de Kotlin Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Funções inline: eliminando a sobrecarga de lambdas
  2. Modificadores noinline e crossinline
  3. Parâmetros de tipo reified: acessando T em tempo de execução
  4. Padrões práticos com reified: análise, DI e serialização
← Voltar para Kotlin Academy