Careeroza
Sealed vs Enum vs Abstract
Which One?
| enum class | sealed class / interface | abstract class / open | |
|---|---|---|---|
| Set of subtypes | fixed constants | fixed subclasses | open to anyone |
| Instances per case | exactly one | many (or one with object) | many |
| Different data per case | no (same properties) | yes | yes |
| Exhaustive when | yes | yes | no (needs else) |
| Example | Direction, Plan, OrderStatus | UiState, Result, NetworkError | BaseActivity, Account |
Same Idea, Two Ways
Example
Use an enum when cases carry no extra data; switch to sealed types when they do.
enum class ConnectionType { WIFI, MOBILE, NONE }
sealed interface Connection {
data class Wifi(val ssid: String) : Connection
data class Mobile(val network: String, val signalBars: Int) : Connection
data object Offline : Connection
}
fun describe(c: Connection) = when (c) {
is Connection.Wifi -> "Wi-Fi: ${c.ssid}"
is Connection.Mobile -> "${c.network} with ${c.signalBars} bars"
Connection.Offline -> "No internet"
}
fun main() {
println(ConnectionType.entries)
listOf(Connection.Wifi("Home_5G"), Connection.Mobile("Jio 5G", 3), Connection.Offline)
.forEach { println(describe(it)) }
}Output
[WIFI, MOBILE, NONE] Wi-Fi: Home_5G Jio 5G with 3 bars No internet