English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Classes de Dados (Data) no Kotlin

You may encounter a situation where you need to create a class that is only used to save data. In this case, you can mark the class as data to create a data class. For example,

data class Person(val name: String, var age: Int)

For this class, the compiler will automatically generate:

  • copy() function, equals() and hashCode() pairs, and the toString() form of the primary constructor

  • componentN() function

Before discussing these functions in detail, let's discuss the requirements that data classes must meet.

Requirements for Kotlin data classes

The requirements are as follows:

  • The primary constructor must have at least one parameter.

  • The parameters of the primary constructor must be marked as val (read-only) or var (read-write).

  • The class cannot be open, abstract, inner, or sealed.

  • This class can extend other classes or implement interfaces. If you are using1.1Previous versions of Kotlin required this class to implement an interface.

Exemplo: Usando classes de dados Kotlin

data class User(val nome: String, val idade: Int)
fun main(args: Array<String>) {
    val jack = User("jack", 29)
    println("nome = ${jack.nome}")
    println("idade = ${jack.idade}")
}

A saída ao executar o programa é:

nome = jack
age = 29

Quando você declara uma classe de dados, o compilador gera automaticamente várias funções no fundo, como toString(), equals(), hashCode(), etc. Isso ajuda a manter o código conciso. Se você usar Java, precisará escrever muita código样板.
Vamos usar a seguinte função:

A função copy() - Cópia

Para classes de dados, você pode usar a função copy() para criar cópias de objetos com propriedades diferentes. O seu funcionamento é o seguinte:

data class User(val nome: String, val idade: Int)
fun main(args: Array<String>) {
    val u1 = User("John", 29)
   
    //Use a função de cópia para criar objetos
    val u2 = u1.copy(nome = "Randy")
    println("u1: nome = ${u1.nome}, nome = ${u1.idade")
    println("u2: nome = ${u2.nome}, nome = ${u2.idade")
}

A saída ao executar o programa é:

u1: nome = John, nome = 29
u2: nome = Randy, nome = 29

O método toString() - Retorna a string

A função toString() retorna a representação de string do objeto.

data class User(val nome: String, val idade: Int)
fun main(args: Array<String>) {
    val u1 = User("John", 29)
    println(u1.toString())
}

A saída ao executar o programa é:

User(nome = John, idade =29)

hashCode() e equals()

O método hasCode() retorna o código hash do objeto. Se dois objetos forem iguais, o hashCode() produzirá o mesmo resultado inteiro.

Se dois objetos forem iguais (hashCode() igual), o equals() retorna true. Se os objetos não forem iguais, o equals() retorna false.

data class User(val nome: String, val idade: Int)
fun main(args: Array<String>) {
    val u1 = User("John", 29)
    val u2 = u1.copy()
    val u3 = u1.copy(nome = "Amanda")
    println("u1 hashCode = ${u1.hashCode()")
    println("u2 hashCode = ${u2.hashCode()")
    println("u3 hashCode = ${u3.hashCode()")
    if (u1.equals(u2) == true)
        println("u1 é igual a u2.
    else
        println("u1 não é igual a u2.
    if (u1.equals(u3) == true)
        println("u1 é igual a u3.
    else
        println("u1 não é igual a u3.
}

A saída ao executar o programa é:

u1 hashCode = 71750738
u2 hashCode = 71750738
u3 hashCode = 771732263
u1 é igual a u2.
u1 não é igual a u3.

Declaração de desestruturação

Você pode usar declarações de desestruturação para descompor um objeto em várias variáveis. Por exemplo:

data class User(val name: String, val age: Int, val gender: String)
fun main(args: Array<String>) {
    val u1 = User("John", 29, "Masculino")
    val (nome, idade, genero) = u1
    println("nome = $name")
    println("idade = $age")
    println("gender = $gender")
}

A saída ao executar o programa é:

name = John
age = 29
gender = Masculino

Isso é possível porque o compilador gera automaticamente o método component() para todos os atributos da classe de dados. Por exemplo:

data class User(val name: String, val age: Int, val gender: String)
fun main(args: Array<String>) {
    val u1 = User("John", 29, "Masculino")
    println(u1.component1())     // John
    println(u1.component2())     // 29  
    println(u1.component3())     // "Masculino"
}

A saída ao executar o programa é:

John
29
Masculino