Skip to Content

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 class tự 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