Bỏ qua để đến nội dung

📦 Data Class

🎯 Mục tiêu: Hiểu Data Class - class chuyên để chứa data với auto-generated equals(), hashCode(), toString(), copy().


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)
}

// 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)

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)
}

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")
}
}

  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)

// 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}")
}
}

  • 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