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 passadacrossinline→ 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, é inlinecrossinline: 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
- Funções inline: eliminando a sobrecarga de lambdas
- Modificadores noinline e crossinline
- Parâmetros de tipo reified: acessando T em tempo de execução
- Padrões práticos com reified: análise, DI e serialização