Cubalah dengan sumber di Kotlin

1. Pengenalan

Bahasa terurus, seperti bahasa yang menyasarkan JVM, secara automatik mengendalikan sumber yang paling biasa: memori.

Walau bagaimanapun, kita perlu menangani semua jenis sumber daya, bukan hanya memori: fail, sambungan rangkaian, aliran, tingkap, dll. Dan, seperti memori, mereka perlu dilepaskan apabila tidak lagi diperlukan.

Dalam artikel ini, kita akan melihat bagaimana sumber daya dapat dikendalikan secara automatik di Kotlin dan bagaimana ia berbeza dari konstruksi sumber daya percubaan Java.

Sekiranya anda ingin melangkau teori, lompat terus ke contoh.

2. Pengurusan Sumber Automatik

Kita dapat membezakan tiga fasa yang berbeza ketika bekerja dengan sumber daya di Java (pseudocode):

resource = acquireResource() try { useResource(resource) } finally { releaseResource(resource) } 

Sekiranya bahasa atau perpustakaan bertanggung jawab untuk melepaskan sumber (bahagian akhirnya ), maka kami memanggilnya Pengurusan Sumber Automatik. Ciri sedemikian membebaskan kita dari tidak ingat untuk membebaskan sumber.

Juga, kerana pengurusan sumber biasanya berkaitan dengan ruang lingkup blok, jika kita berurusan dengan lebih dari satu sumber pada masa yang sama, sumber tersebut akan selalu dikeluarkan dalam urutan yang betul.

Di Java, objek yang menyimpan sumber dan layak untuk pengurusan sumber automatik melaksanakan antara muka tertentu: Dapat ditutup untuk sumber daya yang berkaitan dengan I / O dan AutoCloseable .

Juga, Java 7 memasang semula antara muka Tutup yang sudah ada untuk memperluas AutoCloseable .

Oleh itu, Kotlin mempunyai konsep pemegang sumber yang sama: iaitu objek yang melaksanakan sama ada Tutup atau AutoCloseable .

3. Fungsi penggunaan di Kotlin

Untuk mengurus sumber secara automatik, beberapa bahasa mempunyai konstruk khusus: Java 7 memperkenalkan sumber daya percubaan, misalnya, sementara C # memiliki kata kunci yang menggunakan .

Kadang-kadang, mereka menawarkan corak, seperti RAII di C ++. Dalam beberapa kes lain, mereka memberi kita kaedah perpustakaan.

Kotlin tergolong dalam kategori terakhir.

Dengan reka bentuk, ia tidak mempunyai konstruk bahasa yang serupa dengan sumber daya percubaan di Java.

Sebagai gantinya, kita dapat mencari kaedah peluasan yang disebut penggunaan di perpustakaan standardnya.

Kami akan melihatnya secara terperinci kemudian. Buat masa ini, kita hanya perlu tahu bahawa setiap objek pemegang sumber mempunyai kaedah penggunaan yang boleh kita gunakan .

3.1. Bagaimana untuk menggunakannya

Contoh mudah:

val writer = FileWriter("test.txt") writer.use { writer.write("something") }

Kita dapat menggunakan fungsi penggunaan pada objek apa pun yang menerapkan AutoCloseable atau Closeable , seperti halnya sumber daya di Java.

Kaedah ini mengambil ungkapan lambda, melaksanakannya dan membuang sumber (dengan memanggil dekat () padanya setiap kali pelaksanaan meninggalkan blok, baik secara normal atau dengan pengecualian.

Jadi, dalam kes ini, selepas digunakan, yang penulis tidak lagi boleh digunakan, kerana Kotlin telah ditutup secara automatik ia.

3.2. Borang yang lebih pendek

Dalam contoh di atas, untuk kejelasan, kami menggunakan pemboleh ubah yang disebut penulis , sehingga membuat penutupan.

Walau bagaimanapun, penggunaan menerima ungkapan lambda dengan satu parameter - objek yang memegang sumber:

FileWriter("test.txt") .use { w -> w.write("something") }

Dalam blok, kita juga boleh menggunakan pembolehubah yang tersirat ia :

FileWriter("test.txt") .use { it.write("something") }

Jadi, seperti yang kita lihat, kita tidak perlu memberikan nama eksplisit objek tersebut. Walau bagaimanapun, biasanya idea yang baik adalah jelas daripada menulis kod yang terlalu ringkas.

3.3. Definisi penggunaan ()

Mari kita lihat definisi fungsi penggunaan di Kotlin, seperti yang terdapat di perpustakaan standardnya:

public inline fun  T.use(block: (T) -> R): R

Kita dapat melihat, di bahagiannya, penggunaan itu didefinisikan sebagai fungsi perpanjangan pada antara muka Java yang Dapat Ditutup .

Lebih banyak mengenai kaedah peluasan boleh didapati dalam artikel pengenalan kami.

Sudah tentu, fungsi penggunaan didokumentasikan sebagai sebahagian dari perpustakaan standard Kotlin.

3.4. Boleh ditutup vs AutoTutup

Jika kita memberi perhatian lebih dekat dengan contoh dari bahagian sebelum ini, kita dapat melihat bahawa penggunaan tanda tangan fungsi ditakrifkan hanya pada Closeable antara muka. Ini kerana perpustakaan standard Kotlin mensasarkan Java 6.

Dalam versi Java sebelum 7, AutoCloseable tidak ada dan, tentu saja, Closeable tidak memperluasnya.

Dalam praktiknya, kelas yang melaksanakan AutoCloseable tetapi tidak Boleh ditutup jarang berlaku. Namun, kita mungkin menemui salah satunya.

Dalam hal ini, kita hanya perlu menambahkan ketergantungan pada peluasan Kotlin untuk Java 7, 8 atau versi apa pun yang kita targetkan:

 org.jetbrains.kotlin kotlin-stdlib-jdk8 

Versi ketergantungan terbaru boleh didapati di Maven Central.

Itu memberi kita fungsi pemanjangan penggunaan lain yang ditentukan pada antara muka AutoCloseable :

public inline fun  T.use(block: (T) -> R): R

4. Kesimpulan

Dalam tutorial ini, kita telah melihat bagaimana fungsi penyambungan sederhana di perpustakaan standard Kotlin adalah yang kita perlukan untuk menguruskan semua jenis sumber yang diketahui oleh JVM secara automatik.

Pelaksanaan semua contoh dan potongan kod ini boleh didapati di projek GitHub.