DEV Community

Isaias Velasquez
Isaias Velasquez

Posted on

How to modelar dados com data classes em Kotlin

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)
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

Para imprimir, voce ja ganha um toString legivel:

println(usuario)
// Usuario(nome=Joao, email=joao@email.com, idade=30)
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

A desestruturacao (destructuring declaration) vem de graca:

val (nome, email, idade) = usuario
println("$nome, $email, $idade anos")
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)
}
Enter fullscreen mode Exit fullscreen mode

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)