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