Data Class trong Kotlin
1. Giới thiệu
Data class tự động tạo các functions như equals(), hashCode(), toString(), copy().
2. Khai báo Data Class
data class User(
val name: String,
val age: Int,
val email: String
)
fun main() {
val user = User("Alice", 25, "alice@email.com")
println(user) // User(name=Alice, age=25, email=alice@email.com)
}3. Tự động sinh functions
data class Person(val name: String, val age: Int)
fun main() {
val p1 = Person("Alice", 25)
val p2 = Person("Alice", 25)
// equals()
println(p1 == p2) // true
// hashCode()
println(p1.hashCode() == p2.hashCode()) // true
// toString()
println(p1) // Person(name=Alice, age=25)
}4. copy() function
data class User(val name: String, val age: Int)
fun main() {
val user1 = User("Alice", 25)
// Copy với thay đổi
val user2 = user1.copy(age = 26)
println(user2) // User(name=Alice, age=26)
// Copy nguyên bản
val user3 = user1.copy()
}5. Destructuring
data class Point(val x: Int, val y: Int)
fun main() {
val point = Point(10, 20)
// Destructuring
val (x, y) = point
println("x=$x, y=$y") // x=10, y=20
// Trong lambda
val points = listOf(Point(1, 2), Point(3, 4))
points.forEach { (x, y) -> println("$x, $y") }
}6. Default values
data class Config(
val host: String = "localhost",
val port: Int = 8080,
val secure: Boolean = false
)
fun main() {
val default = Config()
val custom = Config(port = 3000, secure = true)
println(default) // Config(host=localhost, port=8080, secure=false)
println(custom) // Config(host=localhost, port=3000, secure=true)
}7. Properties ngoài constructor
data class Person(val name: String) {
// Không tham gia equals, hashCode, toString
var age: Int = 0
}
fun main() {
val p1 = Person("Alice")
val p2 = Person("Alice")
p1.age = 25
p2.age = 30
println(p1 == p2) // true (chỉ so sánh name)
}8. Nested Data Class
data class Address(val city: String, val street: String)
data class Person(
val name: String,
val address: Address
)
fun main() {
val person = Person(
"Alice",
Address("Hanoi", "123 Main St")
)
println(person)
}9. So sánh với regular class
// Regular class - phải tự implement
class RegularUser(val name: String, val age: Int) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is RegularUser) return false
return name == other.name && age == other.age
}
override fun hashCode() = 31 * name.hashCode() + age
override fun toString() = "RegularUser(name=$name, age=$age)"
}
// Data class - tự động có sẵn
data class DataUser(val name: String, val age: Int)10. Yêu cầu của Data Class
// ✅ Correct
data class Valid(val x: Int) // Ít nhất 1 property
// ❌ Không được abstract, open, sealed, inner
// abstract data class Wrong(val x: Int)
// open data class Wrong(val x: Int)
// ✅ Có thể implement interface
interface Printable { fun print() }
data class Doc(val content: String) : Printable {
override fun print() = println(content)
}📝 Tóm tắt
data classtự sinh equals, hashCode, toString, copy- Destructuring với
val (a, b) = object copy()tạo bản sao với thay đổi- Chỉ properties trong constructor tham gia so sánh
- Không thể abstract, open, sealed, inner
Last updated on