Skip to Content

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 đẹp
  • copy() - tạo bản sao
  • componentN() - 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

  1. Primary constructor phải có ít nhất 1 parameter
  2. Parameters phải là val hoặc var
  3. 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 response

Lờ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 data keyword
  • 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