Kotlin const vs val: qual a diferença e o que escolher?

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

Kotlin const vs val: qual a diferença e o que escolher?

\n\n

Você está escrevendo código em Kotlin e de repente se pergunta: "Qual é, afinal, a diferença entre const e val? Ambos não são imutáveis?". Ótima pergunta! Esse ponto confunde até mesmo desenvolvedores experientes que estão migrando do Java ou de outras linguagens. Não é à toa que no Stack Overflow o tópico "What is the difference between 'const' and 'val'?" acumula milhares de visualizações. Hoje vamos entender de uma vez por todas essa questão, organizar a teoria e reforçar tudo com exemplos práticos de código.

\n\n

Pronto? Vamos lá!

\n\n

Breve introdução: o que é val?

\n\n

Vamos começar pelo mais simples. val (da palavra value — valor) é uma referência imutável. Você pode atribuir um valor a ela uma única vez e nunca mais alterá-lo. Parece familiar? Sim, é análogo ao final em Java ou ao readonly em C#.

\n\n
val nome: String = "Alice"\nnome = "Bob" // Erro de compilação! Val cannot be reassigned
\n\n

Mas há uma nuance importante: val garante que a referência não mudará, mas não garante a imutabilidade do objeto em si. Se você usar val com uma lista mutável (MutableList), ainda poderá adicionar e remover elementos.

\n\n
val numeros = mutableListOf(1, 2, 3)\nnumeros.add(4) // Funciona!\n// numeros = mutableListOf(5, 6) // Erro! Não é possível reatribuir a referência
\n\n

val pode ser inicializado tanto no momento da declaração quanto posteriormente no código (por exemplo, no construtor ou no bloco init). Seu valor é calculado durante a execução do programa (runtime).

\n\n

E o que é const? O guardião rigoroso do tempo de compilação

\n\n

const é o irmão mais rigoroso do val. Ele também é imutável, mas com um superpoder: o valor deve ser conhecido em tempo de compilação (compile-time). Em outras palavras, é uma constante verdadeira, que o compilador pode substituir diretamente no código, como se fosse embutida.

\n\n

const tem regras rígidas:

\n
    \n
  • Só pode ser declarado no nível do arquivo (fora de uma classe) ou dentro de um object / companion object.
  • \n
  • Deve ser de um tipo primitivo ou do tipo String.
  • \n
  • Não pode ser o resultado de uma chamada de função ou cálculo — apenas um literal ou outra constante.
  • \n
\n\n
// Correto\nconst val PI = 3.14159\nconst val NOME_APP = "MeuApp"\n\n// Incorreto\nconst val horaAtual = System.currentTimeMillis() // Erro! Valor não conhecido em tempo de compilação\nconst val nomeUsuario = obterNome() // Erro! Chamada de função não é permitida
\n\n

Principais diferenças: const vs val em tabela

\n\n

Para ficar mais claro, aqui está uma tabela comparativa:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Critérioconst valval
Momento da inicializaçãoEm tempo de compilaçãoEm tempo de execução
Onde pode ser declaradoNível superior, object, companion objectEm qualquer lugar (dentro de classe, função, construtor)
Tipos de dadosApenas primitivos e StringQualquer tipo (incluindo objetos, listas)
DesempenhoMáximo (inlining)Padrão
Uso em anotaçõesSimNão
\n\n

Exemplo prático: anotações e desempenho

\n\n

Um dos usos mais comuns

Blogs

Book Recommendations