Discover how sealed classes can save you from tricky bugs by making your code smarter and safer!
Why Sealed classes in Android Kotlin? - Purpose & Use Cases
Imagine you are building an app that handles different types of user actions like clicking a button, swiping, or typing. You try to manage all these actions using simple classes or enums, but it quickly becomes confusing to keep track of all possible cases.
Using plain classes or enums means you might forget to handle some action types, leading to bugs. Also, your code becomes cluttered with many if-else or when statements that are hard to read and maintain.
Sealed classes let you define a fixed set of subclasses in one place. This way, the compiler knows all possible types, helping you write safer and cleaner code. It forces you to handle every case explicitly, reducing errors.
abstract class Action class Click : Action() class Swipe : Action() // But you might miss handling some types in when
sealed class Action { class Click : Action() class Swipe : Action() } // when covers all cases, compiler checks
Sealed classes enable you to write clear, safe, and maintainable code by knowing all possible types upfront.
In a chat app, sealed classes can represent message states like Sent, Received, or Failed, ensuring your UI handles each state properly without missing any.
Sealed classes define a closed set of subclasses.
They help the compiler check all cases are handled.
This leads to safer and cleaner code.
Practice
sealed class in Kotlin?Solution
Step 1: Understand sealed class inheritance
A sealed class restricts which classes can inherit from it, limiting subclasses to those defined in the same file.Step 2: Compare with other class types
Unlike open classes, sealed classes do not allow unlimited subclassing, ensuring all subclasses are known at compile time.Final Answer:
To restrict class inheritance to a fixed set of subclasses -> Option DQuick Check:
Sealed class = fixed subclass set [OK]
- Thinking sealed classes allow any subclass anywhere
- Confusing sealed classes with abstract classes
- Assuming sealed classes create anonymous classes
Result in Kotlin?Solution
Step 1: Recall sealed class declaration syntax
The keywordsealedprecedesclassfollowed by the class name and braces.Step 2: Check each option
sealed class Result {} matches the correct syntax. Options B and C have wrong keyword order. sealed interface Result {} declares a sealed interface, not a sealed class.Final Answer:
sealed class Result {} -> Option BQuick Check:
sealed class syntax = "sealed class Name {}" [OK]
- Swapping 'sealed' and 'class' keywords
- Using 'sealed interface' instead of 'sealed class'
- Omitting braces after class name
sealed class Response {
object Success : Response()
object Error : Response()
}
fun handle(response: Response) {
when(response) {
is Response.Success -> println("Success")
is Response.Error -> println("Error")
}
}
handle(Response.Success)Solution
Step 1: Identify the passed object type
The function is called withResponse.Success, which matches the first when branch.Step 2: Check the when branches
The when expression prints "Success" forResponse.Successand "Error" forResponse.Error.Final Answer:
Success -> Option CQuick Check:
Response.Success triggers "Success" print [OK]
- Confusing Success and Error outputs
- Forgetting to call the function with correct subclass
- Expecting compile error due to sealed class
sealed class State {}
class Loading : State()
class Success : State()
class Error : State()Solution
Step 1: Recall sealed class subclass rules
All subclasses of a sealed class must be declared in the same file as the sealed class.Step 2: Analyze the code snippet
The subclasses Loading, Success, Error are declared separately after the sealed class. This violates the rule because direct subclasses of a sealed class must be declared in the same file as the sealed class.Final Answer:
Subclasses must be declared inside the sealed class file -> Option AQuick Check:
Sealed subclasses must be in same file [OK]
- Declaring subclasses in different files
- Thinking sealed classes cannot have subclasses
- Confusing sealed classes with abstract classes
NetworkState having Loading, Success with data, and Error with message. Which is the best way to define Success and Error subclasses?Solution
Step 1: Understand subclass data needs
Success needs to hold data, and Error needs to hold a message, so they require properties.Step 2: Choose subclass type
Data classes are ideal for subclasses with properties because they provide equals, hashCode, and toString automatically.Final Answer:
Use data classes with properties inside the sealed class -> Option AQuick Check:
Data classes hold data in sealed subclasses [OK]
- Using object for subclasses needing data
- Using abstract classes unnecessarily
- Using interfaces instead of sealed subclasses
Ready to prove it?
Pass the test and this pattern moves unknown
