Kotlin Academy · Pelajaran

Menumpuk dan Menggabungkan Hierarki Sealed

Bangun mesin status kompleks dengan menumpuk tipe sealed.

Pelajaran 4 dari 413 langkah

Menumpuk dan Menggabungkan Hierarki Sealed adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Kotlin Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Kotlin Academy mencakup 4 pelajaran total.

Menyusun Pohon Status

Status di dunia nyata sering memiliki banyak dimensi. Tipe tersegel dapat dibuat bertingkat atau beberapa hierarki dapat digabungkan untuk memodelkan domain yang kompleks secara rapi.

Kelas Tersegel Bertingkat

Deklarasikan tipe tersegel anak di dalam tipe tersegel luar. Kompilator tetap memastikan kelengkapan di seluruh pohon.

sealed class UiState {
    object Loading : UiState()
    sealed class Loaded : UiState() {
        data class Success(val items: List<String>) : Loaded()
        data class Empty(val message: String) : Loaded()
    }
    data class Error(val msg: String) : UiState()
}
fun render(s: UiState) = when (s) {
    UiState.Loading -> "loading"
    is UiState.Loaded.Success -> "${s.items.size} items"
    is UiState.Loaded.Empty -> "empty: ${s.message}"
    is UiState.Error -> "err: ${s.msg}"
}
fun main() {
    println(render(UiState.Loaded.Success(listOf("a", "b"))))
}

Antarmuka Tersegel untuk Campuran

Gunakan antarmuka tersegel saat suatu status memiliki beberapa aspek yang saling bebas—setiap aspek menggunakan antarmuka yang berbeda.

sealed interface Authenticated
data class User(val id: Int) : Authenticated
object Guest
sealed interface Permission
object Read : Permission
object Write : Permission
fun describe(a: Authenticated, p: Permission): String = when {
    a is User && p is Write -> "user ${a.id} can write"
    a is User -> "user ${a.id} can read"
    else -> "?"
}
fun main() {
    println(describe(User(1), Write))
}

Menggabungkan Hierarki

Teruskan dua nilai tersegel dan lakukan percabangan berdasarkan gabungannya—gunakan when dengan penjaga kondisi.

sealed class Theme { object Light : Theme(); object Dark : Theme() }
sealed class Lang { object En : Lang(); object Tr : Lang() }
fun greet(theme: Theme, lang: Lang) = when {
    theme is Theme.Dark && lang is Lang.Tr -> "Karanlik Merhaba"
    theme is Theme.Light && lang is Lang.Tr -> "Aydinlik Merhaba"
    theme is Theme.Dark -> "Dark Hello"
    theme is Theme.Light -> "Light Hello"
    else -> "?"
}
fun main() {
    println(greet(Theme.Dark, Lang.Tr))
}

Mesin Status dengan Varian Bertingkat

Modelkan alur kerja bertahap sebagai tipe tersegel bertingkat—setiap tahap memiliki variannya sendiri.

sealed class Checkout {
    object Start : Checkout()
    sealed class Payment : Checkout() {
        object Pending : Payment()
        data class Failed(val reason: String) : Payment()
        object Captured : Payment()
    }
    object Shipped : Checkout()
    object Delivered : Checkout()
}
fun describe(c: Checkout) = when (c) {
    Checkout.Start -> "starting"
    Checkout.Payment.Pending -> "awaiting payment"
    is Checkout.Payment.Failed -> "payment failed: ${c.reason}"
    Checkout.Payment.Captured -> "paid"
    Checkout.Shipped -> "shipped"
    Checkout.Delivered -> "delivered"
}
fun main() {
    println(describe(Checkout.Payment.Failed("card declined")))
}

Menggunakan Kembali Hierarki Tersegel di Berbagai Modul

Tipe tersegel paling baik didefinisikan per modul. Untuk komposisi lintas modul, tampilkan antarmuka tersegel agar setiap modul dapat menambahkan implementasinya sendiri.

sealed interface Notification
data class Email(val to: String) : Notification
data class Sms(val phone: String) : Notification
fun send(n: Notification) = when (n) {
    is Email -> "sending email to ${n.to}"
    is Sms -> "texting ${n.phone}"
}
fun main() {
    println(send(Email("a@example.com")))
}

Properti Dasar Bersama

Kelas tersegel dapat mendeklarasikan properti bersama—semua subtipe mewarisinya. Ini menjaga status dan metadata tetap DRY.

sealed class HttpResponse(val code: Int) {
    class Ok(val body: String) : HttpResponse(200)
    class NotFound(val path: String) : HttpResponse(404)
    class ServerError(val cause: String) : HttpResponse(500)
}
fun describe(r: HttpResponse) = "[${r.code}] " + when (r) {
    is HttpResponse.Ok -> r.body
    is HttpResponse.NotFound -> "not found: ${r.path}"
    is HttpResponse.ServerError -> "fail: ${r.cause}"
}
fun main() {
    println(describe(HttpResponse.Ok("hello")))
}

Memodelkan Pohon Rekursif

Tipe tersegel secara alami menjelaskan struktur rekursif seperti pohon ekspresi.

sealed class Expr {
    data class Num(val value: Int) : Expr()
    data class Add(val left: Expr, val right: Expr) : Expr()
    data class Mul(val left: Expr, val right: Expr) : Expr()
}
fun eval(e: Expr): Int = when (e) {
    is Expr.Num -> e.value
    is Expr.Add -> eval(e.left) + eval(e.right)
    is Expr.Mul -> eval(e.left) * eval(e.right)
}
fun main() {
    val expr = Expr.Add(Expr.Num(3), Expr.Mul(Expr.Num(4), Expr.Num(5)))
    println(eval(expr)) // 23
}

Menggabungkan dengan Generik

Tipe tersegel dapat bersifat generik, sehingga memungkinkan pembungkus hasil bertipe seperti Result<T>.

sealed class ApiResult<out T> {
    data class Success<T>(val data: T) : ApiResult<T>()
    data class Failure(val message: String) : ApiResult<Nothing>()
}
fun handle(r: ApiResult<String>) = when (r) {
    is ApiResult.Success -> "got ${r.data}"
    is ApiResult.Failure -> "err: ${r.message}"
}
fun main() {
    println(handle(ApiResult.Success("hi")))
    println(handle(ApiResult.Failure("nope")))
}

Antipola: Tingkat Bertingkat Terlalu Dalam

Tingkat bertingkat yang dalam menyembunyikan maksud kode. Jika pohon tersegel memiliki lebih dari dua tingkat, pertimbangkan untuk meratakannya atau mengekstrak subpohon ke dalam berkasnya sendiri.

sealed class Top {
    sealed class Mid : Top() {
        sealed class Deep : Mid() {
            object Leaf : Deep()
        }
    }
}
fun main() {
    val l = Top.Mid.Deep.Leaf
    println(l::class.simpleName)
}

Menggabungkan melalui Komposisi

Saat dua dimensi status saling bebas, pilih komposisi (kelas data yang membungkus dua nilai tersegel) daripada hierarki yang bertingkat terlalu dalam.

sealed class Loading { object Active : Loading(); object Idle : Loading() }
sealed class Auth { data class Signed(val id: Int) : Auth(); object Anon : Auth() }
data class AppState(val loading: Loading, val auth: Auth)
fun main() {
    val s = AppState(Loading.Active, Auth.Signed(1))
    println(s)
}

Pemeriksaan Singkat

Apa pendekatan yang disarankan saat dua dimensi status saling bebas?

Ringkasan

Buat tipe tersegel bertingkat untuk status berbentuk pohon; gabungkan hierarki tersegel yang saling bebas dengan komposisi (kelas data pembungkus). Tambahkan properti bersama ke dasar tersegel, gunakan generik untuk hasil bertipe, dan modelkan struktur rekursif secara alami. Jagalah agar tingkat bertingkat tetap dangkal.

Gratis untuk memulai

Belajar Kotlin dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
51
Pelajaran
203

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menumpuk dan Menggabungkan Hierarki Sealed” gratis?

Ya — teks lengkap “Menumpuk dan Menggabungkan Hierarki Sealed” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Kotlin Academy, upgrade ke CoddyKit PRO. Kursus Kotlin Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Menumpuk dan Menggabungkan Hierarki Sealed”?

Bangun mesin status kompleks dengan menumpuk tipe sealed. Kamu berlatih Kotlin Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Kotlin Academy?

Tidak diperlukan pengalaman sebelumnya. Kotlin Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Menumpuk dan Menggabungkan Hierarki Sealed” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Kotlin Academy ini?

Ya. Setiap pelajaran Kotlin Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. sealed class vs sealed interface: Kapan Menggunakan Masing-Masing
  2. when Lengkap dengan Hierarki Sealed
  3. Memodelkan Status UI dengan Sealed Class
  4. Menumpuk dan Menggabungkan Hierarki Sealed
← Kembali ke Kotlin Academy