sealed class dan interface di Kotlin — apa itu, sintaksis dan penerapan

Penulis: IT Sectr Diterbitkan: 2026-06-20 Waktu membaca: 11 mnt

sealed class dan sealed interface di Kotlin adalah mekanisme hierarki tipe terbatas, di mana semua subclass yang mungkin diketahui pada tahap kompilasi. Berbeda dengan kelas abstrak biasa, sealed class menjamin pemrosesan lengkap semua varian dalam ekspresi when. Menurut dokumentasi JetBrains Kotlin Language Guide (2026), tipe sealed adalah dasar untuk pemodelan status, layar UI, dan tipe hasil di proyek Kotlin.

Poin Utama

  • sealed — hierarki terbatas, di mana semua subclass diketahui pada tahap kompilasi
  • when — pemrosesan lengkap semua subclass tanpa blok else wajib
  • sealed interface — ditambahkan di Kotlin 1.5 untuk hierarki fleksibel tanpa batasan pewarisan
  • Kompilasi — kesalahan kompilasi saat when tidak lengkap untuk tipe sealed
  • Hierarki — semua subclass harus berada di file yang sama atau di dalam kelas sealed

Apa itu sealed class dan sealed interface?

sealed class adalah kelas abstrak dengan batasan: semua subclass langsungnya harus dideklarasikan di file yang sama dengan sealed class. Batasan ini membuat hierarki menjadi tertutup (sealed) — tidak ada kode di luar file yang dapat menambahkan subclass baru.

sealed interface, ditambahkan di Kotlin 1.5, memberikan jaminan yang sama dengan fleksibilitas antarmuka: sealed interface dapat diimplementasikan oleh beberapa kelas, objek, atau antarmuka lain dalam satu file. Berbeda dengan sealed class, sealed interface tidak memiliki batasan pewarisan tunggal — sebuah kelas dapat mengimplementasikan beberapa sealed interface secara bersamaan.

Menurut Kotlin Evolution and Roadmap (2026), sealed interface ditambahkan atas permintaan komunitas untuk pemodelan yang lebih fleksibel. Motivasi utamanya adalah kemampuan untuk menggabungkan hierarki tipe independen tanpa pewarisan kelas berganda.

Sintaksis sealed class

Deklarasi sealed class dimulai dengan kata kunci sealed sebelum class. Subclass dideklarasikan di file yang sama.

kotlin
sealed class NetworkResult {
    data class Success(val data: String) : NetworkResult()
    data class Error(val message: String) : NetworkResult()
    object Loading : NetworkResult()
}

Setiap subclass dari sealed class dapat memiliki properti dan metode sendiri. Loading adalah singleton (object), Success dan Error adalah data class dengan parameter. Kompiler mengetahui ketiga varian dan memeriksa kelengkapannya saat digunakan dalam when.

Sealed class bersarang

sealed kelas dapat bersarang, menciptakan hierarki bertingkat untuk model data kompleks tanpa kehilangan keamanan tipe.

kotlin
sealed class UiState {
    object Idle : UiState()
    object Loading : UiState()
    data class Content(val items: List<Item>) : UiState()
    data class Error(val exception: Throwable) : UiState()
}

Sintaksis sealed interface (Kotlin 1.5+)

sealed interface dideklarasikan mirip dengan sealed class, tetapi memungkinkan implementasi beberapa sealed interface dalam satu kelas.

kotlin
sealed interface Action
sealed interface Loggable

data class Navigate(val route: String) : Action, Loggable
data class ShowToast(val text: String) : Action
object GoBack : Action, Loggable

Kelas Navigate mengimplementasikan dua sealed interface sekaligus — Action dan Loggable. Untuk sealed class hal ini tidak mungkin karena batasan pewarisan tunggal. sealed interface memberikan fleksibilitas menggabungkan hierarki independen.

Kapan memilih sealed interface daripada sealed class

sealed interface lebih disukai ketika hierarki tidak memerlukan status bersama atau konstruktor. Menurut JetBrains Kotlin Guidelines (2026), sealed interface harus digunakan secara default untuk semua hierarki baru di mana konstruktor bersama tidak diperlukan, membuat kode lebih fleksibel untuk pengembangan di masa depan.

Pemrosesan lengkap dalam when

Keuntungan utama tipe sealed adalah pemrosesan lengkap (exhaustive) dalam ekspresi when. Kompiler memeriksa bahwa semua subclass yang mungkin telah diperhitungkan.

kotlin
fun handleResult(result: NetworkResult): String = when (result) {
    is NetworkResult.Success -> "Data: ${result.data}"
    is NetworkResult.Error -> "Error: ${result.message}"
    is NetworkResult.Loading -> "Loading..."
    // else tidak diperlukan — kompiler tahu bahwa semua varian tercakup
}

Jika pengembang menambahkan subclass baru ke hierarki sealed tetapi lupa memprosesnya dalam when — kompiler akan memberikan kesalahan. Ini adalah keamanan di tingkat tipe, yang tidak tersedia saat menggunakan hierarki terbuka dengan cabang else.

Menurut Google Android Developers (2026), kelas sealed adalah cara yang direkomendasikan untuk memodelkan status UI di Jetpack Compose. Pemeriksaan when yang lengkap mencegah situasi ketika pengembang belum memproses semua kemungkinan varian tampilan layar.

Perbandingan sealed class dengan enum class

enum class dan sealed class sering tertukar, tetapi memiliki tujuan dan kemampuan yang berbeda.

Karakteristiksealed classenum class
InstanceBanyak (data class), satu (object)Tepat satu per konstanta
PropertiBerbeda untuk setiap subclassSama untuk semua konstanta
PewarisanYa (dari sealed class)Tidak (implicit final)
KonstruktorDapat memiliki parameterHanya bersama untuk semua konstanta
HierarkiTerbatas, sealedKumpulan konstanta tetap

Pilihan antara sealed class dan enum class tergantung pada tugas. Jika varian tidak membawa data tambahan — gunakan enum. Jika setiap varian berisi bidang unik — gunakan sealed class atau sealed interface.

Skenario penerapan praktis

Tipe sealed digunakan dalam proyek Kotlin untuk sejumlah skenario standar yang memerlukan pemodelan dengan keamanan tipe.

Status UI di Jetpack Compose

Setiap layar Compose dapat memiliki sealed class UiState yang menggambarkan semua kemungkinan status: Idle, Loading, Content(data), Error(exception). Ekspresi when menjamin bahwa semua status telah diproses.

Hasil permintaan jaringan

NetworkResult dengan varian Success, Error, Loading — pola standar dalam proyek Kotlin dengan Retrofit dan Ktor. sealed class memastikan pemrosesan aman setiap hasil permintaan.

Navigasi di proyek multi-modul

sealed interface untuk rute navigasi memungkinkan modul mendeklarasikan rute mereka sendiri dalam satu hierarki. Ini menghilangkan kesalahan dengan rute yang tidak dikenal pada tahap kompilasi.

Menurut KotlinConf (2025), sealed class dan sealed interface adalah dasar desain type-safe di aplikasi Kotlin modern. Mereka dikombinasikan dengan data class untuk memodelkan struktur domain kompleks tanpa kehilangan keamanan pada tahap kompilasi.

Pertanyaan Umum

Di mana subclass sealed class harus dideklarasikan?

Semua subclass langsung dari sealed class harus dideklarasikan di file yang sama. Untuk sealed interface aturan yang sama — implementasi dalam satu file.

Bisakah sealed interface memiliki implementasi di file lain?

Tidak, aturan satu file berlaku juga untuk sealed interface. Semua implementasi harus berada di file tempat sealed interface dideklarasikan.

Apa perbedaan antara sealed class dan sealed interface?

sealed interface tidak memiliki status dan konstruktor, memungkinkan implementasi berganda. sealed class dapat memiliki konstruktor dan status bersama, tetapi kelas hanya dapat mewarisi satu sealed class.

Bagaimana kelas sealed membantu dalam ekspresi when?

Kompiler memeriksa kelengkapan when: jika tidak semua subclass diproses, kode tidak dikompilasi. Ini menghilangkan kesalahan runtime dan membuat kode lebih aman.

Bisakah sealed class dengan konstruktor dibuat?

Ya, sealed class dapat memiliki konstruktor (secara default private). Semua subclass dapat meneruskan parameter ke konstruktor ini melalui super().

Kesimpulan

  • sealed class — hierarki terbatas dengan subclass diketahui pada tahap kompilasi
  • sealed interface — alternatif fleksibel (Kotlin 1.5+) dengan dukungan implementasi berganda
  • when — pemrosesan lengkap dengan pemeriksaan kompiler, else tidak diperlukan
  • Satu file — semua subclass dan implementasi harus berada di file yang sama dengan tipe sealed
  • Pemodelan — status UI, hasil jaringan, navigasi, sistem event
  • Keamanan — menambahkan subclass baru tanpa pemrosesan dalam when menyebabkan kesalahan kompilasi
  • Pilihan — sealed interface lebih disukai secara default, sealed class saat status bersama diperlukan

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga