Funções Suspend em Kotlin: o que são e como usar em 2025

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

O que está por trás da palavra-chave suspend em Kotlin?



Se você já escreveu em Kotlin e tentou chamar uma função marcada com o modificador suspend, mas sem uma corrotina — provavelmente recebeu um erro de compilação. E isso não é um bug, é uma funcionalidade. Funções suspend são a base da programação assíncrona em Kotlin. Em 2025, elas se tornaram ainda mais convenientes, mas as dúvidas de iniciantes (e até de desenvolvedores experientes) não desapareceram. Uma das perguntas mais populares no Stack Overflow — "What does a suspend function mean in Kotlin coroutines?" — acumulou milhares de visualizações. Vamos entender de uma vez por todas.



Função suspend — não é mágica, é um contrato



Imagine que você está pedindo uma pizza. Você liga para o restaurante, faz o pedido e, em vez de esperar 20 minutos ao telefone, continua fazendo suas coisas. Quando a pizza fica pronta, eles ligam para você — você "retorna" à conversa. Isso é uma função suspend: ela pode pausar sua execução sem bloquear a thread e depois retomar quando o resultado estiver disponível.



Tecnicamente, suspend não é uma palavra-chave que torna uma função assíncrona "do nada". É um contrato: a função pode pausar, mas não é obrigada. O compilador Kotlin transforma essa função em uma máquina de estados que sabe salvar e restaurar seu estado.



Como é uma função suspend no código?



Aqui está um exemplo simples:



suspend fun fetchUserData(userId: String): User {    delay(1000) // simulação de requisição de rede    return User(userId, "Alexei")}


Você não pode chamar fetchUserData diretamente fora de uma corrotina:



// Erro de compilação!fun main() {    val user = fetchUserData("123") // Suspend function 'fetchUserData' should be called only from a coroutine or another suspend function}


Para chamá-la, você precisa estar dentro de uma corrotina. Por exemplo:



fun main() = runBlocking {    val user = fetchUserData("123")    println(user.name) // Alexei}


runBlocking é a ponte entre o mundo normal e o mundo das corrotinas. Em projetos reais, você quase nunca o usará em produção (exceto em testes e no main). Em vez disso, você iniciará corrotinas através de CoroutineScope.



O que acontece "por baixo dos panos"?



Quando o compilador vê suspend, ele gera um parâmetro adicional — um objeto Continuation. Esse objeto armazena o ponto onde a corrotina foi pausada e todas as variáveis locais. Graças a isso, a corrotina pode "dormir" em uma thread e "acordar" em outra — sem bloqueio.



Importante: uma função suspend não bloqueia a thread. Enquanto ela "dorme" (por exemplo, aguardando uma resposta do servidor), a thread pode executar outras tarefas. Essa é a principal diferença das abordagens antigas (Thread.sleep, callback hell).



Melhores práticas para usar funções suspend em 2025



Nos últimos anos, o ecossistema Kotlin cresceu muito. Novas bibliotecas surgiram, o compilador e a IDE melhoraram. Aqui está o que você precisa saber e aplicar agora.



1. Não crie funções suspend que não pausam



Se uma função não contém chamadas para outras funções suspend (por exemplo, delay, withContext, chamadas de API via Ktor/Retrofit), não adicione suspend a ela. Isso é enganoso e adiciona sobrecarga desnecessária.



// Ruimsuspend fun formatName(first: String, last: String): String {    return "$first $last".trim()}

// Bomfun formatName(first: String, last: String): String { return "$first $last".trim()}


2. Use withContext para alternar o dispatcher



Se você precisa executar uma operação bloqueante (ler arquivo, trabalhar com banco de dados), não marque a função como suspend e não a torne

Blogs

Book Recommendations