#6 The Elegance of Kotlin Sealed Classes vs the Sophistication of Enums: A Delicate Balance

In Kotlin, sealed classes and enums are powerful constructs with unique characteristics and purposes. This blog post explores the differences between them, providing code snippets and examples to showcase their usage and applications

#6 The Elegance of Kotlin Sealed Classes vs the Sophistication of Enums: A Delicate Balance

Introduction

In the realm of Kotlin, a kingdom of powerful constructs awaits developers, ready to be harnessed for diverse scenarios. Among these regal constructs are sealed classes and enums, adorned with their own unique characteristics and purposes. In this splendid blog post, we embark on a journey to explore the lavish differences between sealed classes and enums in Kotlin. Through resplendent code snippets and illustrious examples, we shall unravel their splendorous usage and applications.

Section 1: Introduction to Sealed Classes and Enums

Before we immerse ourselves in the opulent distinctions between sealed classes and enums, let us acquaint ourselves with these majestic constructs.

Sealed Classes:

Behold, the sealed class, a noble entity that bestows restrictions upon its subclasses. With its powers, it confines the realm of subclasses within the same file or module. Sealed classes are often favored when the need arises to acknowledge and handle a finite number of subclasses, ensuring that all possibilities are known and gracefully embraced.

Enums:

Welcome, dear reader, to the realm of enums, where a fixed set of constant values reign supreme. In Kotlin, enums manifest as regal classes, adorned with a limited number of predefined instances. Their majestic presence graces us when we require a small, fixed set of options that stand alone in their exclusive nature.

Section 2: Distinctions between Sealed Classes and Enums

2.1 Extensibility:

One of the key differentiating factors between sealed classes and enums lies within their extensibility. The sealed class, ever open to the wonders of extension, allows the creation of new subclasses within the same file or module. On the contrary, the enum, a bastion of exclusivity, remains closed to extension, disallowing the creation of new instances or subclasses.

1sealed class Result
2class Success(val data: Any) : Result()
3class Error(val message: String) : Result()
4
5enum class Status {
6 SUCCESS, ERROR
7}

2.2 Usage in When Expressions:

Both sealed classes and enums hold the potential to grace the exalted halls of “when” expressions, yet their behavior diverges subtly. When employing a sealed class within a “when” expression, one must gracefully handle all possible subclasses, ensuring a symphony of coverage and preventing any discordant compilation errors.

1fun processResult(result: Result) {
2 when (result) {
3 is Success -> {
4 // Revel in the triumphant success!
5 }
6 is Error -> {
7 // Alas, an error has befallen us!
8 }
9 }
10}

In contrast, enums shimmer within “when” expressions without the need for explicit handling of all cases. The compiler, ever vigilant, checks if all enum values are embraced, graciously gracing us with a compilation error should any cases be overlooked.

1fun processStatus(status: Status) {
2 when (status) {
3 Status.SUCCESS -> {
4 // Bask in the glory of success!
5 }
6 Status.ERROR -> {
7 // Face the challenges presented by an error!
8 }
9 }
10}

2.3 Flexibility in Data Structures:

Sealed classes, dear reader, offer a realm of unbridled flexibility when it comes to defining the structure of data associated with each subclass. Each subclass, a unique entity in its own right, boasts its properties, methods, and distinctive behavior. This opulence allows for the creation of intricate data structures, where each subclass is treated with the reverence it deserves.

On the other hand, enums possess a fixed structure, shared amongst all instances. While each enum instance may possess additional properties and methods, these treasures are shared amongst all individuals within the enum class.

1sealed class Vehicle {
2 abstract fun drive()
3}
4
5class Car(val model: String) : Vehicle() {
6 override fun drive() {
7 println("Driving the esteemed car $model")
8 }
9}
10
11class Bike(val brand: String) : Vehicle() {
12 override fun drive() {
13 println("Embarking on a grand adventure with the majestic bike $brand")
14 }
15}
16
17enum class Color(val rgb: Int) {
18 RED(0xFF0000),
19 GREEN(0x00FF00),
20 BLUE(0x0000FF)
21}

2.4 Memory Usage:

Behold, for enums, crafted as singletons, exude an aura of exclusivity. Within their realm, only one instance of each enum value exists, ensuring a realm of efficiency in memory usage. This luxury becomes evident in scenarios where a fixed set of options reign supreme, gracefully shared amongst all who traverse their dominion.

Sealed classes, however, offer a more diverse array of instances within each subclass. This grandeur, while resplendent, may result in increased memory usage when numerous instances grace the realm or when instances dynamically emerge at runtime.

2.5 Opulent Use Cases:

Sealed classes, dear reader, often find their place in the grand tapestry of code when a realm of closed, interrelated classes requires expression. They shine with a radiant brilliance when tasked with modeling state machines, where each sealed class represents a distinct state, a jewel in the crown of architectural elegance.

Enums, on the other hand, grace our code with their elegance when a small, distinguished set of options demands representation. They are cherished companions in the realm of categories, status codes, or any other scenario where a limited number of choices reign supreme.

Section 3: Conclusion

Sealed classes and enums, both resplendent constructs within the kingdom of Kotlin, possess their own unique strengths and purposes. Sealed classes, with their extensibility and flexibility in data structures, offer a realm of boundless possibilities for modeling intricate hierarchies. Enums, on the other hand, exude an aura of exclusivity, providing a fixed set of options, coupled with memory efficiency, in the pursuit of representing mutually exclusive choices.

To wield the power of sealed classes and enums with finesse, understanding their distinctions is paramount. By embracing the splendor of these constructs, you shall grace your codebase with elegance, fostering an environment of maintainable and luxurious Kotlin code.

References

  1. Kotlin Official Documentation - Sealed Classes

  2. Kotlin Official Documentation - Enum Classes

  3. Kotlin Programming By Example by Iyanu Adelekan

  4. Kotlin in Action by Dmitry Jemerov and Svetlana Isakova

Comments