Represent a value that must be one of a small set of known shapes.

sealed-class A sealed class keeps its direct subclasses known to the compiler.

Sealed Class Basics

body
SealedClassBasics.kt
Replay: real traced execution (multi-file project)
sealed class Message
data class TextMessage(val body: String) : Message()
object EmptyMessage : Message()

fun describe(message: Message): String {
    if (message is TextMessage) {
        return "text:${message.body.length}"
    }
    return "empty"
}

fun main() {
    val body = "hi"
    val message: Message

    if (body == "") {
        message = EmptyMessage
    } else {
        message = TextMessage(body)
    }

    val label = describe(message)

    println("body=${body.ifEmpty { "none" }}")
    println("label=$label")
}
sealed class Message
data class TextMessage(val body: String) : Message()
object EmptyMessage : Message()

fun describe(message: Message): String {
    if (message is TextMessage) {
        return "text:${message.body.length}"
    }
    return "empty"
}

fun main() {
    val body = ""
    val message: Message

    if (body == "") {
        message = EmptyMessage
    } else {
        message = TextMessage(body)
    }

    val label = describe(message)

    println("body=${body.ifEmpty { "none" }}")
    println("label=$label")
}
sealed class Message
data class TextMessage(val body: String) : Message()
object EmptyMessage : Message()

fun describe(message: Message): String {
    if (message is TextMessage) {
        return "text:${message.body.length}"
    }
    return "empty"
}

fun main() {
    val body = "hello"
    val message: Message

    if (body == "") {
        message = EmptyMessage
    } else {
        message = TextMessage(body)
    }

    val label = describe(message)

    println("body=${body.ifEmpty { "none" }}")
    println("label=$label")
}
  1. body ← hi

    12fun main() {13    val body→ hi = "hi" //@body="", "hello"14    val message: Message
  2. else

    17    message = EmptyMessage18} else {19    message = TextMessage(bodyhi)20}
  3. val label = describe(message)

    22val label = describe(message)
  4. fun describe(message: Message): String

    5fun describe(message: Message): String {6    if (message is TextMessage) {
  5. if (message is TextMessage)

    5fun describe(message: Message): String {6    if (message is TextMessage) {7        return "text:${message.bodyhi.length}"8    }
  6. label ← text:2

    22    val label→ text:2 = describe(message)2324    println("body=${bodyhi.ifEmpty { "none" }}")25    println("label=$labeltext:2")26}
    outputbody=hi
    label=text:2
  1. body ← (empty)

    12fun main() {13    val body→ (empty) = ""14    val message: Message
  2. if (body == "")

    16if (body(empty) == "") {17    message = EmptyMessage18} else {
  3. val label = describe(message)

    22val label = describe(message)
  4. fun describe(message: Message): String

    5fun describe(message: Message): String {6    if (message is TextMessage) {7        return "text:${message.body.length}"8    }9    return "empty"10}
  5. label ← empty

    22    val label→ empty = describe(message)2324    println("body=${body(empty).ifEmpty { "none" }}")25    println("label=$labelempty")26}
    outputbody=none
    label=empty
  1. body ← hello

    12fun main() {13    val body→ hello = "hello"14    val message: Message
  2. else

    17    message = EmptyMessage18} else {19    message = TextMessage(bodyhello)20}
  3. val label = describe(message)

    22val label = describe(message)
  4. fun describe(message: Message): String

    5fun describe(message: Message): String {6    if (message is TextMessage) {
  5. if (message is TextMessage)

    5fun describe(message: Message): String {6    if (message is TextMessage) {7        return "text:${message.bodyhello.length}"8    }
  6. label ← text:5

    22    val label→ text:5 = describe(message)2324    println("body=${bodyhello.ifEmpty { "none" }}")25    println("label=$labeltext:5")26}
    outputbody=hello
    label=text:5