Buku "Kotlin. Pemrograman untuk para profesional "

gambar Hai, habrozhiteli! Buku karya Josh Skin dan David Greenhall ini didasarkan pada kursus Kotlin Essentials yang populer dari Big Nerd Ranch. Contoh nyata dan berguna, penjelasan yang jelas tentang konsep-konsep kunci dan API dasar tidak hanya memperkenalkan bahasa Kotlin, tetapi juga mengajarkan cara menggunakan kemampuannya secara efektif, dan juga memungkinkan Anda untuk menguasai lingkungan pengembangan JetBrains IntelliJ IDEA.

Tidak masalah jika Anda adalah pengembang berpengalaman yang ingin melampaui Jawa, atau sedang belajar bahasa pemrograman pertama. Josh dan David akan memandu Anda dari prinsip-prinsip dasar hingga penggunaan Kotlin yang lebih lama sehingga Anda dapat membuat aplikasi yang andal dan efisien.


Untuk siapa buku ini?


Kami (penulis) menulis buku ini untuk pengembang berbagai kaliber: pengembang Android berpengalaman yang tidak memiliki fitur Java, pengembang kode server tertarik pada fitur Kotlin, serta untuk pemula yang memutuskan untuk belajar bahasa kompilasi yang efektif.

Buku ini mungkin menarik bagi Anda untuk mendukung Android, tetapi tidak terbatas pada pemrograman di Kotlin untuk Android. Terlebih lagi, dalam buku ini, hanya satu bab - bab 21 - yang membahas teknik pemrograman Kotlin untuk Android. Namun demikian, jika Anda tertarik pada topik menggunakan Kotlin untuk mengembangkan aplikasi Android, buku ini akan memperkenalkan Anda pada teknik dasar yang akan menyederhanakan proses penulisan aplikasi Android di Kotlin.

Meskipun Kotlin telah dipengaruhi oleh beberapa bahasa lain, Anda tidak perlu tahu bagaimana mereka dirancang agar berhasil dengan Kotlin. Dari waktu ke waktu, kami akan membandingkan kode Java dan Kotlin. Jika Anda memiliki pengalaman mengembangkan di Jawa, ini akan membantu Anda memahami hubungan antara kedua bahasa. Dan jika Anda tidak memiliki pengalaman seperti itu, contoh-contoh pemecahan masalah yang sama dalam bahasa lain akan membantu Anda memahami ide-ide yang memengaruhi pembentukan Kotlin.

Cara menggunakan buku ini


Buku ini bukan referensi. Tujuan kami adalah belajar bahasa Kotlin secara konsisten. Anda akan bekerja dengan proyek dan mempelajari bahasa dalam prosesnya. Untuk efek yang lebih besar, kami sarankan Anda mencoba semua contoh kode saat Anda membaca buku. Bekerja dengan contoh akan membantu Anda mengembangkan memori “otot” dan memberikan wawasan yang memungkinkan Anda untuk berpindah dari satu bab ke bab lainnya.

Setiap bab berikutnya didasarkan pada yang sebelumnya. Kami sarankan untuk tidak melewatkan bab. Bahkan jika Anda telah mempelajari topik tersebut saat bekerja dengan bahasa lain, kami sarankan Anda setidaknya membacanya di sini: banyak hal diimplementasikan secara berbeda di Kotlin. Kami akan mulai dengan topik pengantar, seperti variabel dan daftar, dan kemudian beralih ke teknik pemrograman berorientasi objek dan fungsional untuk membuat Anda memahami apa yang membuat Kotlin seperti alat yang ampuh. Di akhir buku, Anda akan beralih dari pemula ke pengembang lanjutan di Kotlin.

Kami ingin menambahkan bahwa Anda tidak boleh terburu-buru: mengembangkan, gunakan dokumentasi Kotlin di tautan: kotlinlang.org/docs/reference , di mana ada jawaban untuk banyak pertanyaan yang muncul selama percobaan.

Kutipan. Ekstensi


Ekstensi memungkinkan Anda untuk menambahkan fungsionalitas ke suatu tipe tanpa secara eksplisit mengubah deklarasi tipe. Gunakan ekstensi dengan tipe khusus, serta dengan tipe yang tidak dapat Anda kontrol, seperti Daftar, String, dan tipe lain dari perpustakaan standar Kotlin.
Ekstensi adalah alternatif warisan. Mereka sangat cocok untuk menambahkan fungsionalitas ke tipe jika definisi kelas tidak tersedia untuk Anda atau kelas tidak memiliki pengubah terbuka untuk memungkinkan subklasifikasi.

Perpustakaan standar Kotlin sering menggunakan ekstensi. Misalnya, fungsi standar yang Anda pelajari di bab 9 adalah ekstensi yang dideklarasikan, dan dalam bab ini Anda akan melihat beberapa contoh deklarasi mereka.

Dalam bab ini, pertama-tama kita akan bekerja pada proyek Sandbox, dan kemudian menerapkan pengetahuan ini untuk mengoptimalkan kode NyetHack. Untuk memulainya, buka proyek Sandbox dan buat file baru bernama Extensions.kt.

Deklarasi Fungsi Ekstensi


Ekstensi pertama Anda memungkinkan Anda untuk menambah antusiasme ke String. Nyatakan dalam Extensions.kt.

Listing 18.1. Menambahkan ekstensi untuk tipe String (Extensions.kt)

fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) 

Fungsi ekstensi dideklarasikan dengan cara yang sama seperti fungsi lainnya, tetapi dengan satu perbedaan: ketika mendefinisikan fungsi ekstensi, Anda juga menentukan tipe yang dikenal sebagai tipe penerima yang mana ekstensi menambahkan fitur. (Ingat Bab 9, di mana kami memanggil tipe extensible "penerima.") Untuk fungsi addEnthusiasm, String penerima ditentukan.

Isi fungsi addEnthusiasm hanyalah satu ekspresi yang mengembalikan sebuah string: isi ini dan 1 atau lebih tanda seru, tergantung pada nilai argumen jumlah (1 adalah nilai default). Kata kunci ini merujuk ke instance objek tujuan yang ekstensinya dipanggil (dalam hal ini, instance String).
Sekarang Anda dapat memanggil fungsi addEnthusiasm untuk setiap instance dari String. Coba fungsi ekstensi baru dengan mendeklarasikan baris di fungsi utama dan memanggil fungsi ekstensi addEnthusiasm untuk menampilkan hasilnya.

Listing 18.2. Memanggil ekstensi baru untuk instance objek penerima String (Extensions.kt)

 fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun main(args: Array<String>) { println("Madrigal has left the building".addEnthusiasm()) } 

Jalankan Extensions.kt dan lihat apakah fungsi ekstensi menambahkan tanda seru pada string, sebagaimana dimaksud.

Apakah mungkin untuk subkelas String untuk menambahkan kemampuan ini ke instance String? Di IntelliJ, lihat kode sumber untuk deklarasi String dengan menekan tombol Shift dua kali untuk membuka kotak dialog Search Everywhere dan masukkan "String.kt" di kotak pencarian. Anda akan melihat deklarasi kelas ini:

 public class String : Comparable<String>, CharSequence { ... } 

Karena kata kunci terbuka tidak ada dalam deklarasi kelas String, Anda tidak dapat mensubklasifikasikan String untuk menambahkan fitur baru melalui pewarisan. Seperti yang disebutkan sebelumnya, ekstensi adalah opsi yang baik jika Anda ingin menambahkan fungsionalitas ke kelas yang tidak dapat Anda kelola atau tidak dapat digunakan untuk membuat subkelas.

Deklarasi ekstensi superclass


Ekstensi tidak bergantung pada warisan, tetapi mereka dapat digabungkan dengan warisan untuk meningkatkan cakupan. Coba ini di Extensions.kt: nyatakan ekstensi untuk tipe Any dengan nama easyPrint. Karena ekstensi dideklarasikan untuk Any, ekstensi akan tersedia untuk semua jenis. Secara utama, ganti fungsi panggilan println dengan panggilan ekstensi easyPrint ke String.

Listing 18.3. Ekstensi apa saja (Extensions.kt)

 fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun Any.easyPrint() = println(this) fun main(args: Array<String>) { println("Madrigal has left the building".addEnthusiasm()).easyPrint() } 

Jalankan Extensions.kt dan pastikan bahwa outputnya tidak berubah.

Karena Anda menambahkan ekstensi untuk semua jenis, itu juga tersedia untuk subtipe. Tambahkan panggilan ekstensi untuk Int.

Listing 18.4. easyPrint tersedia untuk semua subtipe (Extensions.kt)

 fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun Any.easyPrint() = println(this) fun main(args: Array<String>) { "Madrigal has left the building".addEnthusiasm().easyPrint() 42.easyPrint() } 

Fungsi Ekstensi Umum


Tetapi bagaimana jika Anda ingin mencetak baris “Madrigal telah meninggalkan gedung” sebelum dan sesudah menambah semangat?

Untuk melakukan ini, tambahkan kemampuan memanggil rantai ke fungsi easyPrint. Anda telah melihat rantai panggilan fungsi: fungsi dapat berpartisipasi dalam rantai jika mereka mengembalikan objek penerima atau objek lain yang fungsi selanjutnya dapat dipanggil.
Tingkatkan easyPrint untuk memanggil chaining.

Listing 18.5. Ubah easyPrint untuk memanggil chaining (Extensions.kt)

 fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun Any.easyPrint()= println(this): Any { println(this) return this } ... 

Sekarang coba panggil fungsi easyPrint dua kali: sebelum dan sesudah addEnthusiasm.

Listing 18.6. Panggil easyPrint dua kali (Extensions.kt)

 fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun Any.easyPrint(): Any { println(this) return this } fun main(args: Array<String>) { "Madrigal has left the building".easyPrint().addEnthusiasm().easyPrint() 42.easyPrint() } 

Kode tidak dikompilasi. Panggilan easyPrint pertama diizinkan, tetapi addEnthusiasm tidak. Lihatlah jenis informasi untuk memahami mengapa hal ini terjadi: klik easyPrint dan tekan Control-Shift-P (Ctrl-P) dan dari daftar ekstensi yang muncul, pilih yang pertama: ("Madrigal telah meninggalkan gedung .easyPrint ()") (Gbr. 18.1).

Fungsi easyPrint mengembalikan string yang dipanggil, tetapi menggunakan tipe Any untuk mewakilinya. addEnthusiasm hanya tersedia untuk String, sehingga tidak bisa dipanggil pada nilai yang dikembalikan oleh easyPrint.

gambar

Untuk mengatasi masalah ini, Anda dapat membuat ekstensi umum. Perbarui fungsi ekstensi easyPrint dan gunakan tipe generik sebagai akseptor alih-alih Apa saja.

Listing 18.7. Generalisasi easyPrint (Extensions.kt)

 fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun <T> AnyT.easyPrint(): AnyT { println(this) return this } ... 

Sekarang, ketika ekstensi menggunakan parameter dari tipe T umum sebagai penerima dan mengembalikan T sebagai ganti Any, informasi tentang tipe spesifik objek penerima diteruskan ke rantai (Gbr. 18.2).

gambar

Coba jalankan Extensions.kt lagi. Kali ini saluran akan ditampilkan dua kali:

 Madrigal has left the building Madrigal has left the building! 42 

Fungsi ekstensi umum baru Anda berfungsi dengan jenis apa pun, dan juga memproses informasi tentangnya. Ekstensi yang menggunakan tipe generik memungkinkan Anda untuk menulis fungsi yang dapat bekerja dengan berbagai jenis dalam suatu program.

Ekstensi untuk tipe generik juga tersedia di perpustakaan standar Kotlin. Misalnya, lihat deklarasi fungsi let:

 public inline fun <T, R> T.let(block: (T) -> R): R { return block(this) } 

biarkan dinyatakan sebagai fungsi ekstensi generik, yang memungkinkannya untuk bekerja dengan semua jenis. Dibutuhkan lambda yang mengambil objek penerima sebagai argumen (T) dan mengembalikan nilai dari beberapa tipe baru R.

Perhatikan kata kunci sebaris, yang kami pelajari di Bab 5. Saran yang sama yang kami berikan sebelumnya berlaku di sini: mendeklarasikan fungsi ekstensi sebagai bawaan, jika menerima lambda, mengurangi biaya memori.

»Informasi lebih lanjut tentang buku ini dapat ditemukan di situs web penerbit
» Isi
» Kutipan

Diskon 25% untuk kupon untuk Khabrozhitel - Kotlin
Setelah pembayaran versi kertas buku, sebuah buku elektronik dikirim melalui email.

Source: https://habr.com/ru/post/id464177/


All Articles