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
| Aspecto | val | var |
|---|---|---|
| Reatribuição | Não permite | Permite |
| Equivalente em Java | final | variável comum |
| Quando usar | Sempre que possível | Quando 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.