Qual a diferença entre val e var em Kotlin?

Essa é uma das primeiras coisas que você aprende em Kotlin, e entender direitinho a diferença entre val e var vai te poupar muita dor de cabeça. Vamos lá!

A explicação rápida

  • val (de value): declara uma variável imutável. Depois que você atribui um valor, não pode mais mudar.
  • var (de variable): declara uma variável mutável. Você pode alterar o valor quantas vezes quiser.

Pense assim: val é como escrever a caneta, e var é como escrever a lápis.

Na prática

fun main() {
    // val - imutável: uma vez atribuído, não muda
    val nome = "Karina"
    // nome = "Ana"  // ERRO! Não pode reatribuir um val

    // var - mutável: pode mudar à vontade
    var pontuacao = 0
    println("Pontuação inicial: $pontuacao")

    pontuacao = 10
    println("Pontuação atualizada: $pontuacao")

    pontuacao += 5
    println("Pontuação final: $pontuacao")
}

Se você tentar reatribuir um val, o compilador vai reclamar na hora com um erro bem claro. Isso é uma mão na roda pra evitar bugs.

Quando usar cada um?

A regra de ouro é: prefira sempre val. Use var somente quando realmente precisar alterar o valor depois.

Por que? Variáveis imutáveis tornam o código mais previsível e seguro. Quando você sabe que um valor não vai mudar, fica muito mais fácil entender o que o código está fazendo.

fun main() {
    // Boas práticas
    val cpf = "123.456.789-00"          // CPF não muda, usa val
    val dataNascimento = "15/03/1995"   // data de nascimento não muda, usa val
    var saldo = 1000.0                   // saldo muda, usa var

    saldo -= 150.0  // compra no débito
    println("Saldo atual: R$ $saldo")
}

Cuidado: val não significa objeto imutável

Um detalhe que pega muita gente: val impede a reatribuição, mas não impede a modificação interna do objeto. Veja:

fun main() {
    val frutas = mutableListOf("Banana", "Maçã", "Manga")

    // Isso funciona! Estamos modificando a lista, não reatribuindo a variável
    frutas.add("Abacaxi")
    println(frutas) // [Banana, Maçã, Manga, Abacaxi]

    // Isso NÃO funciona! Estamos tentando reatribuir
    // frutas = mutableListOf("Uva")  // ERRO!
}

Se quiser uma lista que não pode ser modificada de jeito nenhum, use listOf() em vez de mutableListOf().

Resumindo

Aspectovalvar
ReatribuiçãoNão permitePermite
Equivalente em Javafinalvariável comum
Quando usarSempre que possívelQuando precisar mudar o valor

Adotar o hábito de usar val por padrão é uma das melhores práticas em Kotlin. Seu código fica mais limpo, mais seguro e mais fácil de manter. Na dúvida, comece com val e só troque pra var se o compilador reclamar que você está tentando alterar o valor.