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 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.
Deklarasi sealed class dimulai dengan kata kunci sealed sebelum class. Subclass dideklarasikan di file yang sama.
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 kelas dapat bersarang, menciptakan hierarki bertingkat untuk model data kompleks tanpa kehilangan keamanan tipe.
sealed class UiState {
object Idle : UiState()
object Loading : UiState()
data class Content(val items: List<Item>) : UiState()
data class Error(val exception: Throwable) : UiState()
}
sealed interface dideklarasikan mirip dengan sealed class, tetapi memungkinkan implementasi beberapa sealed interface dalam satu kelas.
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.
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.
Keuntungan utama tipe sealed adalah pemrosesan lengkap (exhaustive) dalam ekspresi when. Kompiler memeriksa bahwa semua subclass yang mungkin telah diperhitungkan.
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.
enum class dan sealed class sering tertukar, tetapi memiliki tujuan dan kemampuan yang berbeda.
| Karakteristik | sealed class | enum class |
|---|---|---|
| Instance | Banyak (data class), satu (object) | Tepat satu per konstanta |
| Properti | Berbeda untuk setiap subclass | Sama untuk semua konstanta |
| Pewarisan | Ya (dari sealed class) | Tidak (implicit final) |
| Konstruktor | Dapat memiliki parameter | Hanya bersama untuk semua konstanta |
| Hierarki | Terbatas, sealed | Kumpulan 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.
Tipe sealed digunakan dalam proyek Kotlin untuk sejumlah skenario standar yang memerlukan pemodelan dengan keamanan tipe.
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.
NetworkResult dengan varian Success, Error, Loading — pola standar dalam proyek Kotlin dengan Retrofit dan Ktor. sealed class memastikan pemrosesan aman setiap hasil permintaan.
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
Semua subclass langsung dari sealed class harus dideklarasikan di file yang sama. Untuk sealed interface aturan yang sama — implementasi dalam satu file.
Tidak, aturan satu file berlaku juga untuk sealed interface. Semua implementasi harus berada di file tempat sealed interface dideklarasikan.
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.
Kompiler memeriksa kelengkapan when: jika tidak semua subclass diproses, kode tidak dikompilasi. Ini menghilangkan kesalahan runtime dan membuat kode lebih aman.
Ya, sealed class dapat memiliki konstruktor (secara default private). Semua subclass dapat meneruskan parameter ke konstruktor ini melalui super().
Kesimpulan
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.
Baca juga