Kelas Tersegel di Kotlin

1. Perkenalan

Sederhananya, bahasa Kotlin meminjam sejumlah konsep dari bahasa fungsional lain untuk membantu penulisan kode yang lebih aman dan mudah dibaca. Hierarki tertutup adalah salah satu dari konsep ini.

2. Apa Itu Kelas Tertutup?

Sealed Classes memungkinkan kami memperbaiki hierarki tipe dan melarang pengembang membuat subclass baru.

Mereka berguna saat Anda memiliki hierarki pewarisan yang sangat ketat, dengan kumpulan kemungkinan subkelas tertentu dan tidak ada yang lain. Kompilator menjamin bahwa hanya kelas yang didefinisikan dalam file sumber yang sama dengan kelas tersegel yang dapat mewarisi darinya.

Kelas yang disegel juga secara implisit abstrak . Mereka harus diperlakukan seperti itu di seluruh kode Anda, kecuali tidak ada yang bisa menerapkannya.

Kelas yang disegel dapat memiliki bidang dan metode yang ditentukan di dalamnya, termasuk fungsi abstrak dan yang diimplementasikan. Ini berarti bahwa Anda dapat memiliki representasi dasar dari kelas tersebut dan kemudian menyesuaikannya agar sesuai dengan subkelas.

3. Kapan Menggunakan Kelas Tertutup?

Kelas bersegel dirancang untuk digunakan ketika ada sekumpulan opsi yang mungkin sangat spesifik untuk suatu nilai, dan di mana setiap opsi ini secara fungsional berbeda - hanya Tipe Data Aljabar.

Kasus penggunaan umum mungkin termasuk penerapan Mesin Negara atau Pemrograman Monadik, yang menjadi semakin populer dengan munculnya konsep pemrograman fungsional.

Kapan pun Anda memiliki beberapa opsi dan mereka hanya berbeda dalam arti datanya, Anda mungkin lebih baik menggunakan Kelas Enum sebagai gantinya.

Kapan pun Anda memiliki jumlah opsi yang tidak diketahui, Anda tidak dapat menggunakan kelas tertutup karena ini akan menghentikan Anda menambahkan opsi di luar file sumber asli.

4. Menulis Kelas Tertutup

Mari kita mulai dengan menulis kelas tersegel kita sendiri - contoh bagus dari hierarki tersegel semacam itu adalah Opsional dari Java 8 - yang bisa berupa Some atau None.

Saat menerapkan ini, sangat masuk akal untuk membatasi kemungkinan membuat implementasi baru - dua implementasi yang disediakan bersifat lengkap dan tidak ada yang harus menambahkannya sendiri.

Karena itu, kami dapat menerapkan ini:

sealed class Optional { // ... abstract fun isPresent(): Boolean } data class Some(val value: V) : Optional() { // ... override fun isPresent(): Boolean = true } class None : Optional() { // ... override fun isPresent(): Boolean = false }

Sekarang dapat dijamin bahwa setiap kali Anda memiliki instance Opsional , Anda sebenarnya memiliki Some atau None.

Di Java 8, implementasi sebenarnya terlihat berbeda karena tidak adanya class yang disegel.

Kami kemudian dapat menggunakan ini dalam perhitungan kami:

val result: Optional = divide(1, 0) println(result.isPresent()) if (result is Some) { println(result.value) }

Baris pertama akan menampilkan Some atau None . Kami kemudian menampilkan apakah kami mendapat hasil atau tidak.

5. Gunakan Dengan Kapan

Kotlin memiliki dukungan untuk menggunakan kelas tersegel dalam konstruksi when -nya . Karena selalu ada sekumpulan subclass yang mungkin tepat, kompilator dapat memperingatkan Anda jika ada cabang yang tidak ditangani, dengan cara yang persis sama seperti yang dilakukannya untuk enumerasi.

Ini berarti bahwa dalam situasi seperti itu, biasanya tidak diperlukan penangan penampung semua, yang pada gilirannya berarti menambahkan subkelas baru secara otomatis aman - kompilator akan segera memperingatkan Anda jika Anda belum menanganinya, dan Anda akan memerlukannya untuk memperbaiki kesalahan tersebut sebelum melanjutkan.

Contoh di atas dapat diperpanjang menjadi keluaran baik hasil atau kesalahan tergantung pada jenis yang dikembalikan:

val message = when (result) { is Some -> "Answer: ${result.value}" is None -> "No result" } println(message)

Jika salah satu dari dua cabang hilang, ini tidak akan dapat dikompilasi dan malah menghasilkan kesalahan:

'when' expression must be exhaustive, add necessary 'else' branch

6. Ringkasan

Kelas yang disegel bisa menjadi alat yang sangat berharga untuk kotak alat desain API Anda. Mengizinkan hierarki kelas terstruktur yang terkenal yang hanya dapat menjadi salah satu dari kumpulan kelas yang diharapkan dapat membantu menghapus seluruh rangkaian kondisi kesalahan potensial dari kode Anda, sambil tetap membuatnya mudah dibaca dan dipelihara.

Seperti biasa, potongan kode dapat ditemukan di GitHub.