Data classes sao um dos recursos do Kotlin que mais fazem diferenca no dia a dia. Elas substituem dezenas de linhas de Java beans com uma unica linha de codigo.
Veja como declarar uma data class:
data class Usuario(val nome: String, val email: String, val idade: Int)
So isso. O Kotlin ja gera automaticamente os metodos equals(), hashCode(), toString(), copy() e os getters. Em Java voce precisaria de umas 50 linhas para fazer a mesma coisa.
Para criar uma instancia:
val usuario = Usuario("Joao", "joao@email.com", 30)
Para imprimir, voce ja ganha um toString legivel:
println(usuario)
// Usuario(nome=Joao, email=joao@email.com, idade=30)
O metodo copy() e excelente para criar copias com alteracoes:
val usuarioModificado = usuario.copy(idade = 31)
println(usuarioModificado)
// Usuario(nome=Joao, email=joao@email.com, idade=31)
A desestruturacao (destructuring declaration) vem de graca:
val (nome, email, idade) = usuario
println("$nome, $email, $idade anos")
Os componentes gerados sao component1(), component2() e assim por diante, na ordem dos parametros do construtor.
Uma dica: data classes funcionam bem com o operador == do Kotlin (que compara conteudo, nao referencia):
val a = Usuario("Joao", "joao@email.com", 30)
val b = Usuario("Joao", "joao@email.com", 30)
println(a == b) // true
Em Java isso seria false sem um equals personalizado.
Para modelagem de objetos imutaveis em camadas, combine data class com sealed class:
sealed class Resultado<out T> {
data class Sucesso<T>(val dados: T) : Resultado<T>()
data class Erro(val mensagem: String) : Resultado<Nothing>()
}
val res: Resultado<String> = Resultado.Sucesso("funcionou")
when (res) {
is Resultado.Sucesso -> println(res.dados)
is Resultado.Erro -> println(res.mensagem)
}
Uma limitacao: data classes nao podem ser abertas (open) nem abstratas. Cada uma e final. Para heranca, use classes normais. Para composicao de dados, voce nao precisa de heranca com data classes.
That's all for now.
Thanks for reading!
Top comments (0)