Kelas yang dimeteraikan di Kotlin

1. Pengenalan

Ringkasnya, bahasa Kotlin meminjam sejumlah konsep dari bahasa fungsional lain untuk membantu menulis kod yang lebih selamat dan lebih mudah dibaca. Hierarki termeterai adalah salah satu konsep ini.

2. Apakah Kelas Yang Dimeteraikan?

Kelas yang dimeteraikan membolehkan kami memperbaiki hierarki jenis dan melarang pembangun membuat subkelas baru.

Ini berguna apabila anda mempunyai hierarki warisan yang sangat ketat, dengan sekumpulan subkelas yang mungkin dan tidak ada yang lain. Penyusun menjamin bahawa hanya kelas yang ditentukan dalam fail sumber yang sama dengan kelas yang dimeterai yang dapat mewarisi daripadanya.

Kelas yang dimeteraikan juga secara tersirat abstrak . Mereka harus diperlakukan sedemikian sepanjang kod anda yang lain, kecuali bahawa tidak ada yang lain yang dapat menerapkannya.

Kelas tertutup boleh mempunyai bidang dan kaedah yang ditentukan di dalamnya, termasuk fungsi abstrak dan dilaksanakan. Ini bermaksud bahawa anda boleh mempunyai perwakilan dasar kelas dan kemudian menyesuaikannya agar sesuai dengan subkelas.

3. Bilakah Menggunakan Kelas Dimeteraikan?

Kelas tertutup dirancang untuk digunakan apabila ada sekumpulan kemungkinan pilihan yang sangat spesifik untuk suatu nilai, dan di mana setiap pilihan ini berbeza secara fungsional - hanya Jenis Data Algebra.

Kes penggunaan umum mungkin termasuk menerapkan Mesin Negara atau dalam Pengaturcaraan Monadik, yang menjadi semakin populer dengan munculnya konsep pengaturcaraan fungsional.

Bila-bila masa anda mempunyai banyak pilihan dan mereka hanya berbeza dalam pengertian data, anda mungkin lebih baik menggunakan Enum Classes sebagai gantinya.

Bila-bila masa anda mempunyai bilangan pilihan yang tidak diketahui, anda tidak boleh menggunakan kelas tertutup kerana ini akan menghentikan anda menambahkan pilihan di luar fail sumber asal.

4. Menulis Kelas Yang Dimeteraikan

Mari mulakan dengan menulis kelas tertutup kita sendiri - contoh yang baik dari hirarki tertutup tersebut adalah Pilihan dari Java 8 - yang boleh menjadi Sebilangan atau Tidak

Semasa melaksanakan ini, masuk akal untuk menyekat kemungkinan membuat implementasi baru - kedua implementasi yang disediakan adalah lengkap dan tidak ada yang harus menambahkannya sendiri.

Oleh itu, kami dapat melaksanakan 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 }

Kini dapat dijamin bahawa bila-bila masa anda mempunyai contoh Pilihan , anda sebenarnya mempunyai Sebilangan atau Tiada.

Di Java 8, pelaksanaan sebenarnya kelihatan berbeza kerana tidak adanya kelas tertutup.

Kami kemudian dapat menggunakan ini dalam pengiraan kami:

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

Baris pertama akan mengembalikan Sebilangan atau Tiada . Kami kemudian menghasilkan sama ada kami mendapat hasilnya atau tidak.

5. Gunakan Dengan Bila

Kotlin mempunyai sokongan untuk menggunakan kelas yang dimeteraikan pada masa pembinaan. Kerana selalu ada sekumpulan subkelas yang mungkin, pengkompil dapat memberi amaran kepada anda jika cawangan tidak ditangani, dengan cara yang sama seperti yang dilakukannya untuk penghitungan.

Ini bermakna bahawa dalam situasi seperti itu, biasanya tidak memerlukan pengendali tangkapan semua, yang seterusnya bermaksud menambahkan subkelas baru secara automatik selamat - penyusun akan segera memberi amaran kepada anda jika anda belum mengatasinya, dan anda akan memerlukan untuk memperbaiki kesilapan tersebut sebelum meneruskan.

Contoh di atas dapat diperluas ke output sama ada hasil atau kesalahan bergantung pada jenis yang dikembalikan:

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

Sekiranya salah satu daripada kedua-dua cawangan tersebut hilang, ini tidak akan menyusun dan mengakibatkan kesalahan:

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

6. Ringkasan

Kelas yang dimeteraikan boleh menjadi alat yang tidak ternilai untuk kotak alat reka bentuk API anda. Membolehkan hierarki kelas tersusun dan terkenal yang hanya boleh menjadi salah satu kumpulan kelas yang diharapkan dapat membantu menghilangkan sebilangan besar keadaan ralat yang berpotensi dari kod anda, sambil tetap menjadikan sesuatu mudah dibaca dan dikekalkan.

Seperti biasa, coretan kod boleh didapati di GitHub.