Sobes.tech
Junior

Como funcionam as classes de dados em Kotlin?

sobes.tech IA

Resposta da IA

As classes de dados em Kotlin são usadas para armazenar dados. O compilador gera automaticamente os métodos padrão:

  • equals(): Compara instâncias com base nos valores de suas propriedades.
  • hashCode(): Gera um código hash com base nos valores das propriedades.
  • toString(): Retorna uma representação em string que inclui nomes e valores de todas as propriedades.
  • copy(): Cria uma cópia do objeto, alterando os valores das propriedades indicadas, se necessário.
  • componentN(): Métodos para desestruturação (descomposição do objeto em propriedades individuais).
// Exemplo de classe de dados
data class User(val name: String, val age: Int)

fun main() {
    val user1 = User("Alice", 30)
    val user2 = User("Alice", 30)
    val user3 = User("Bob", 25)

    // equals()
    println(user1 == user2) // true
    println(user1 == user3) // false

    // toString()
    println(user1.toString()) // User(name=Alice, age=30)

    // copy()
    val user4 = user1.copy(age = 31)
    println(user4) // User(name=Alice, age=31)

    // componentN() e desestruturação
    val (name, age) = user1
    println("Nome: $name, Idade: $age") // Nome: Alice, Idade: 30
}

Pontos-chave:

  • Todas as propriedades definidas no construtor principal devem ser val ou var.
  • A classe de dados não pode ser abstract, open, sealed ou inner.
  • Classes de dados podem herdar outras classes ou implementar interfaces.
  • Propriedades declaradas fora do construtor principal não participam na geração dos métodos padrão.
Método Descrição
equals() Compara as propriedades do construtor principal.
hashCode() Gera um hash com base nas propriedades do construtor principal.
toString() Exibe uma representação em string das propriedades do construtor principal.
copy() Cria uma cópia superficial com a possibilidade de modificar propriedades.
componentN() Acessa as propriedades na ordem de sua declaração no construtor.

As classes de dados simplificam significativamente o trabalho com POJO (Plain Old Java Object) ou DTO (Data Transfer Object), reduzindo o código boilerplate.