📦 Data Class
🎯 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
Phần tiêu đề “💡 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
Phần tiêu đề “📝 So sánh với Regular Class”// Regular class - phải implement thủ côngclass 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
Phần tiêu đề “🔄 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
Phần tiêu đề “📦 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
Phần tiêu đề “⚠️ 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
// ❌ Invaliddata class Empty // Không có parameters
// ✅ Validdata class User(val id: Int)🛠️ Thực hành
Phần tiêu đề “🛠️ 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, )
val (success, user, _) = response if (success && user != null) { println("User: ${user.name}") }}✅ Checklist
Phần tiêu đề “✅ 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