Kelas Tertutup Kotlin

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 elsecabang untuk kondisi default dalam ekspresi when.

Sekarang, jika Anda mendapatkan subclass baru dari Exprkelas, kompilator tidak akan mendeteksi apa pun karena elsecabang 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 whenekspresi, tidak perlu menggunakan elsebranch.

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 elsecabang. Jika Anda mendapatkan subclass baru dari Exprkelas, kompilator akan mengeluh kecuali subkelas tersebut ditangani dalam whenekspresi.

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 privatedefault.

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.

Artikel yang menarik...