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()andhashCode()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