Data Class trong Kotlin
🎯 Mục tiêu: Hiểu Data Class - class chuyên để chứa data với auto-generated
equals(),hashCode(),toString(),copy().
💡 Khái niệm
Data class tự động implement:
equals()/hashCode()- so sánh theo giá trịtoString()- representation đẹpcopy()- tạo bản saocomponentN()- destructuring
data class User(val name: String, val age: Int)
fun main() {
val user = User("Alice", 25)
println(user) // User(name=Alice, age=25)
}📝 So sánh với Regular Class
// Regular class - phải implement thủ công
class RegularUser(val name: String, val age: Int) {
override fun equals(other: Any?): Boolean {
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ó tất cả!
data class User(val name: String, val age: Int)🔄 copy() - Tạo bản sao với thay đổi
data class User(val name: String, val age: Int, val city: String)
fun main() {
val user1 = User("Alice", 25, "Hanoi")
// Copy và thay đổi một số fields
val user2 = user1.copy(age = 26)
val user3 = user1.copy(name = "Bob", city = "HCMC")
println(user1) // User(name=Alice, age=25, city=Hanoi)
println(user2) // User(name=Alice, age=26, city=Hanoi)
println(user3) // User(name=Bob, age=25, city=HCMC)
}📦 Destructuring
data class User(val name: String, val age: Int)
fun main() {
val user = User("Alice", 25)
// Destructuring declaration
val (name, age) = user
println("$name is $age years old")
// Trong for loop
val users = listOf(User("Alice", 25), User("Bob", 30))
for ((n, a) in users) {
println("$n: $a")
}
}⚠️ Quy tắc Data Class
- Primary constructor phải có ít nhất 1 parameter
- Parameters phải là
valhoặcvar - Không thể là
abstract,open,sealed,inner
// ❌ Invalid
data class Empty // Không có parameters
// ✅ Valid
data class User(val id: Int)🛠️ Thực hành
// TODO: Tạo data class cho API responseLời giải:
data class ApiResponse<T>(
val success: Boolean,
val data: T?,
val error: String? = null
)
data class User(
val id: Int,
val name: String,
val email: String
)
fun main() {
val response = ApiResponse(
success = true,
data = User(1, "Alice", "[email protected]")
)
val (success, user, _) = response
if (success && user != null) {
println("User: ${user.name}")
}
}✅ Checklist
- Tạo data class với
datakeyword - Hiểu auto-generated methods
- Sử dụng
copy()để tạo bản sao - Sử dụng destructuring
Tiếp theo: Enum Class
Last updated on