मुख्य कंटेंट तक स्किप करें

Data Classes

Trushi Jasani
EditReport

Data Classes

What are Data Classes?

A data class is a class designed to hold data. Kotlin automatically generates:

  • equals() — structural comparison
  • hashCode() — hash based on properties
  • toString() — readable string representation
  • copy() — create a modified copy
  • componentN() — 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 val or var.
  • Cannot be abstract, open, sealed, or inner.

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

FeatureAuto-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.