Pada artikel ini, Anda akan belajar tentang kelas Sealed, bagaimana mereka dibuat, dan kapan menggunakannya dengan bantuan contoh.
Kelas yang disegel digunakan ketika nilai hanya dapat memiliki satu jenis dari himpunan terbatas (hierarki terbatas).
Sebelum membahas detail tentang kelas tersegel, mari jelajahi masalah apa yang mereka pecahkan. Mari kita ambil contoh (diambil dari situs resmi Kotlin - Artikel kelas yang disegel):
class Expr class Const(val value: Int) : Expr class Sum(val left: Expr, val right: Expr) : Expr fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) else -> throw IllegalArgumentException("Unknown expression") )
Dalam program di atas, kelas dasar Ekspr memiliki dua kelas turunan Const (mewakili angka) dan Sum (mewakili jumlah dua ekspresi). Di sini, wajib menggunakan else
cabang untuk kondisi default dalam ekspresi when.
Sekarang, jika Anda mendapatkan subclass baru dari Expr
kelas, kompilator tidak akan mendeteksi apa pun karena else
cabang menanganinya yang dapat menyebabkan bug. Akan lebih baik jika kompiler mengeluarkan kesalahan saat kita menambahkan subclass baru.
Untuk mengatasi masalah ini, Anda dapat menggunakan kelas tertutup. Seperti disebutkan, kelas tertutup membatasi kemungkinan membuat subkelas. Dan, saat Anda menangani semua subclass dari kelas tersegel dalam sebuah when
ekspresi, tidak perlu menggunakan else
branch.
Untuk membuat kelas tertutup, pengubah tersegel digunakan. Sebagai contoh,
kelas tertutup Ekspr
Contoh: Kelas Tertutup
Inilah cara Anda menyelesaikan masalah di atas menggunakan kelas tertutup:
sealed class Expr class Const(val value: Int) : Expr() class Sum(val left: Expr, val right: Expr) : Expr() object NotANumber : Expr() fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) NotANumber -> java.lang.Double.NaN )
Seperti yang Anda lihat, tidak ada else
cabang. Jika Anda mendapatkan subclass baru dari Expr
kelas, kompilator akan mengeluh kecuali subkelas tersebut ditangani dalam when
ekspresi.
Beberapa Catatan Penting
- Semua subclass dari kelas tertutup harus dideklarasikan dalam file yang sama di mana kelas tertutup dideklarasikan.
- Kelas tertutup itu abstrak dengan sendirinya, dan Anda tidak dapat membuat instance objek darinya.
- Anda tidak dapat membuat konstruktor non-privat dari kelas tertutup; konstruktornya secara
private
default.
Perbedaan Antara Enum dan Kelas Sealed
Kelas enum dan kelas tersegel sangat mirip. Kumpulan nilai untuk tipe enum juga dibatasi seperti kelas tertutup.
Satu-satunya perbedaan adalah bahwa, enum hanya dapat memiliki satu instance, sedangkan subclass dari kelas tertutup dapat memiliki banyak instance.