Data Classes
Data Classes
What are Data Classes?
A data class is a class designed to hold data. Kotlin automatically generates:
equals()— structural comparisonhashCode()— hash based on propertiestoString()— readable string representationcopy()— create a modified copycomponentN()— destructuring support
Basic Syntax
data class Person(val name: String, val age: Int)
fun main() {
val alice = Person("Alice", 30)
println(alice) // Person(name=Alice, age=30)
}
Auto-Generated toString()
data class Point(val x: Int, val y: Int)
fun main() {
val p = Point(3, 4)
println(p) // Point(x=3, y=4)
}
Auto-Generated equals()
data class User(val name: String, val email: String)
fun main() {
val u1 = User("Alice", "alice@example.com")
val u2 = User("Alice", "alice@example.com")
val u3 = User("Bob", "bob@example.com")
println(u1 == u2) // true — same content
println(u1 == u3) // false — different content
println(u1 === u2) // false — different references
}
copy() Function
Create a copy with some fields changed:
data class Config(
val host: String = "localhost",
val port: Int = 8080,
val debug: Boolean = false
)
fun main() {
val dev = Config()
val prod = dev.copy(host = "example.com", debug = false)
val test = dev.copy(port = 9090, debug = true)
println(dev) // Config(host=localhost, port=8080, debug=false)
println(prod) // Config(host=example.com, port=8080, debug=false)
println(test) // Config(host=localhost, port=9090, debug=true)
}
Destructuring
data class Product(val name: String, val price: Double, val stock: Int)
fun main() {
val item = Product("Laptop", 999.99, 10)
val (name, price, stock) = item
println("$name costs $$price, $stock in stock")
// In loops
val products = listOf(
Product("Phone", 499.0, 25),
Product("Tablet", 299.0, 15)
)
for ((n, p, s) in products) {
println("$n — $$p — qty: $s")
}
}
Data Class in Collections
data class Student(val name: String, val gpa: Double)
fun main() {
val students = listOf(
Student("Alice", 3.9),
Student("Bob", 3.5),
Student("Charlie", 3.7)
)
val top = students.maxByOrNull { it.gpa }
val sorted = students.sortedByDescending { it.gpa }
println("Top student: $top")
sorted.forEach { println(it) }
}
Nested Data Classes
data class Address(val street: String, val city: String, val zip: String)
data class Person(
val name: String,
val age: Int,
val address: Address
)
fun main() {
val person = Person(
"Alice", 28,
Address("123 Main St", "Bangalore", "560001")
)
println(person)
println(person.address.city) // Bangalore
// Copy with nested update
val moved = person.copy(address = person.address.copy(city = "Mumbai"))
println(moved.address.city) // Mumbai
}
Data Class Requirements
- Must have at least one parameter in the primary constructor.
- All primary constructor parameters must be
valorvar. - Cannot be
abstract,open,sealed, orinner.
Data Class vs Regular Class
// Regular class
class PointRegular(val x: Int, val y: Int)
// Data class
data class PointData(val x: Int, val y: Int)
fun main() {
val r1 = PointRegular(1, 2)
val r2 = PointRegular(1, 2)
println(r1 == r2) // false — reference equality
val d1 = PointData(1, 2)
val d2 = PointData(1, 2)
println(d1 == d2) // true — structural equality
}
Summary
| Feature | Auto-generated by data class |
|---|---|
toString() | Yes — shows all properties |
equals() | Yes — structural comparison |
hashCode() | Yes — based on properties |
copy() | Yes — clone with overrides |
componentN() | Yes — for destructuring |
Telemetry Integration
Completed working through this block? Sync progress to workspace.