Core Features

Data Classes and Sealed Classes

Use data classes for value objects and sealed classes for exhaustive when expressions.

Data Classes

Data classes are a concise way to create classes that hold data. Kotlin automatically generates:

  • equals() and hashCode()
  • toString()
  • copy()
  • Component functions for destructuring

Sealed Classes

Sealed classes restrict class hierarchies — all subclasses must be defined in the same file. This enables exhaustive when expressions.

Object Declarations

object creates a singleton — a class with exactly one instance.

Example

kotlin
// Data class
data class User(
    val id: Int,
    val name: String,
    val email: String,
    val isAdmin: Boolean = false
)

val user1 = User(1, "Alice", "alice@example.com")
val user2 = user1.copy(name = "Alicia", isAdmin = true)

println(user1 == user2)  // false (different name)
println(user1)           // User(id=1, name=Alice, email=alice@example.com, isAdmin=false)

// Destructuring
val (id, name, email) = user1
println("$id: $name ($email)")

// Sealed class
sealed class Result<out T> {
    data class Success<T>(val data: T) : Result<T>()
    data class Error(val message: String, val code: Int = 0) : Result<Nothing>()
    object Loading : Result<Nothing>()
}

fun handleResult(result: Result<String>) {
    // Exhaustive when - compiler ensures all cases handled
    when (result) {
        is Result.Success -> println("Got: ${result.data}")
        is Result.Error -> println("Error ${result.code}: ${result.message}")
        Result.Loading -> println("Loading...")
    }
}

// Object - singleton
object DatabaseConfig {
    val url = "jdbc:postgresql://localhost:5432/mydb"
    val maxConnections = 10

    fun createConnection() = "Connected to $url"
}

println(DatabaseConfig.url)
println(DatabaseConfig.createConnection())
Try It Yourself