Kotlin Special Classes Tutorial: Data, Sealed, Enum, Object, Companion Object with Mini Projects


This Kotlin Special Classes tutorial explains advanced class types such as data classes, sealed classes, enum classes, object singletons, and companion objects. The chapter also includes mini projects like a bank account system, employee management system, and library management system to demonstrate practical use of these classes. Each topic includes clear examples and best practices to help learners write clean, efficient, and maintainable Kotlin code.

Kotlin Special Classes – Complete Tutorial

Data Classes

Data classes are used to store data. Kotlin automatically generates useful functions like toString(), equals(), hashCode(), and copy() for data classes.

Syntax


data class Person(val name: String, val age: Int)

Example


fun main() {
val person1 = Person("Muni", 35)
val person2 = person1.copy(age = 36)
println(person1) // Person(name=Muni, age=35)
println(person2) // Person(name=Muni, age=36)
}

Best Practices

  1. Use data classes for classes that primarily hold data.
  2. Avoid mutable properties in data classes if possible.

Sealed Classes

Sealed classes represent restricted class hierarchies. They are useful in when expressions for exhaustive checking.

Syntax


sealed class Result
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()

Example


fun handleResult(result: Result) {
when(result) {
is Success -> println("Data: ${result.data}")
is Error -> println("Error: ${result.message}")
}
}

fun main() {
val res: Result = Success("File loaded")
handleResult(res)
}

Best Practices

  1. Use sealed classes for representing finite hierarchies.
  2. Always handle all possible subclasses in when.

Enum Classes

Enum classes are used to define a set of constants.

Syntax


enum class Direction {
NORTH, SOUTH, EAST, WEST
}

Example


fun main() {
val dir = Direction.NORTH
println(dir)
}

Best Practices

  1. Use enums for predefined constant sets.
  2. Enums can have properties and functions for advanced usage.

Object and Singleton

Object declarations define a singleton – a class with only one instance.

Syntax


object Database {
val name = "MyDB"
fun connect() = println("Connected to $name")
}

Example


fun main() {
Database.connect()
}

Best Practices

  1. Use object for utilities or global resources.
  2. Avoid storing mutable state unless necessary.

Companion Object

Companion objects allow defining members tied to the class rather than instances.

Syntax


class Utils {
companion object {
fun greet() = println("Hello from companion")
}
}

Example


fun main() {
Utils.greet()
}

Best Practices

  1. Use companion objects for factory methods or constants.
  2. Avoid overloading with too much logic.

Mini Projects

Mini Project 1: Bank Account System

Example


data class Account(val id: Int, var balance: Double)

fun main() {
val account = Account(101, 1000.0)
println("Initial Balance: ${account.balance}")
account.balance += 500
println("After Deposit: ${account.balance}")
}

Mini Project 2: Employee Management System

Example


data class Employee(val id: Int, val name: String, var salary: Double)

fun main() {
val emp = Employee(1, "Muni", 50000.0)
println(emp)
emp.salary += 5000
println("Updated Salary: ${emp.salary}")
}

Mini Project 3: Library Management System

Example


data class Book(val title: String, var available: Boolean = true)

fun main() {
val book1 = Book("Kotlin Programming")
println("Book: ${book1.title}, Available: ${book1.available}")
book1.available = false
println("Book: ${book1.title}, Available: ${book1.available}")
}

Summary

This chapter covered Kotlin’s special classes including data classes, sealed classes, enum classes, singleton objects, and companion objects. It also demonstrated practical mini projects like a bank account system, employee management system, and library management system to reinforce understanding and practical application of these classes in real-world scenarios.