Apa itu Kotlin? Alternatif Java menjelaskan

Kotlin adalah bahasa pengaturcaraan "pragmatik" dengan tujuan umum, bebas, sumber terbuka, yang ditaip secara statik yang pada mulanya dirancang untuk JVM (Java Virtual Machine) dan Android yang menggabungkan fitur pengaturcaraan berorientasi objek dan berfungsi. Ia difokuskan pada interoperabilitas, keselamatan, kejelasan, dan sokongan perkakas. Versi Kotlin yang mensasarkan JavaScript ES5.1 dan kod asli (menggunakan LLVM) untuk sebilangan pemproses juga sedang dalam pengeluaran.

Kotlin berasal dari JetBrains, syarikat di belakang IntelliJ IDEA, pada tahun 2010, dan telah menjadi sumber terbuka sejak tahun 2012. Pasukan Kotlin kini mempunyai lebih daripada 90 anggota sepenuh masa dari JetBrains, dan projek Kotlin di GitHub mempunyai lebih daripada 300 penyumbang. JetBrains menggunakan Kotlin dalam banyak produknya termasuk IntelliJ IDEA utamanya.

Kotlin sebagai bahasa Jawa yang lebih ringkas

Pada pandangan pertama, Kotlin kelihatan seperti versi Java yang lebih ringkas dan ringkas. Pertimbangkan tangkapan skrin di atas, di mana saya telah menukar sampel kod Java (di sebelah kiri) ke Kotlin secara automatik. Perhatikan bahawa pengulangan tanpa akal yang wujud dalam memberi contoh pemboleh ubah Java telah hilang. Ungkapan Java

StringBuilder sb = StringBuilder baru ();

Menjadi di Kotlin

val sb = StringBuilder ()

Anda dapat melihat bahawa fungsi didefinisikan dengan funkata kunci, dan titik koma kini menjadi pilihan apabila barisan baru ada. Kata valkunci menyatakan sifat hanya baca atau pemboleh ubah tempatan Begitu juga, varkata kunci menyatakan harta berubah atau pemboleh ubah tempatan.

Walaupun begitu, Kotlin sangat ditaip. Kata kunci valdan varkata kunci hanya boleh digunakan apabila jenisnya dapat disimpulkan. Jika tidak, anda perlu menyatakan jenisnya. Kesimpulan jenis nampaknya bertambah baik dengan setiap pelepasan Kotlin.

Lihat pernyataan fungsi berhampiran bahagian atas kedua panel. Jenis pengembalian di Java mendahului prototaip, tetapi di Kotlin menggantikan prototaip, dibatasi dengan titik dua seperti di Pascal.

Tidak jelas sepenuhnya dari contoh ini, tetapi Kotlin telah melonggarkan syarat Java yang berfungsi sebagai anggota kelas. Di Kotlin, fungsi dapat dinyatakan di tingkat atas dalam file, secara lokal di dalam fungsi lain, sebagai fungsi anggota di dalam kelas atau objek, dan sebagai fungsi perpanjangan. Fungsi peluasan memberikan kemampuan seperti C # untuk memperluas kelas dengan fungsi baru tanpa perlu mewarisi dari kelas atau menggunakan apa-apa jenis corak reka bentuk seperti Dekorasi.

Bagi peminat Groovy, Kotlin melaksanakan pembangun; sebenarnya, pembangun Kotlin boleh diperiksa jenisnya. Kotlin menyokong sifat yang didelegasikan, yang dapat digunakan untuk menerapkan sifat malas, sifat yang dapat dilihat, harta yang dapat dipadam, dan sifat yang dipetakan.

Banyak mekanisme tak segerak yang tersedia dalam bahasa lain dapat dilaksanakan sebagai perpustakaan menggunakan coroutines Kotlin. Ini termasuk async/ awaitdari C # dan ECMAScript, saluran dan pilih dari Go, dan generators/ yielddari C # dan Python.

Pengaturcaraan berfungsi di Kotlin

Membolehkan fungsi tingkat atas hanyalah permulaan kisah pengaturcaraan fungsional untuk Kotlin. Bahasa ini juga menyokong fungsi pesanan tinggi, fungsi tanpa nama, lambdas, fungsi sebaris, penutupan, pengulangan ekor, dan generik. Dengan kata lain, Kotlin mempunyai semua ciri dan kelebihan bahasa yang berfungsi. Sebagai contoh, pertimbangkan simpulan bahasa Kotlin berikut.

Menyaring senarai di Kotlin

val positives = list.filter {x -> x> 0}

Untuk ungkapan yang lebih pendek, gunakan itapabila hanya ada satu parameter dalam fungsi lambda:

val positives = list.filter {it> 0}

Melintasi peta / senarai pasangan di Kotlin

untuk ((k, v) dalam peta) {println (ā€œ$ k -> $ vā€)}

kdan  v boleh disebut apa sahaja.

Menggunakan julat di Kotlin

untuk (i dalam  1..100) {...} // jarak tertutup: termasuk 100

untuk (i dalam  1 hingga 100) {...} // julat separuh terbuka: tidak termasuk 100

untuk (x dalam  2..10 langkah 2) {...}

untuk (x dalam  10 turun Ke 1) {...}

jika (x dalam  1..10) {...}

Contoh di atas menunjukkan  for kata kunci dan juga penggunaan julat.

Walaupun Kotlin adalah bahasa pengaturcaraan fungsional yang lengkap, ia mempertahankan sebagian besar sifat berorientasi objek Java sebagai gaya pengaturcaraan alternatif, yang sangat berguna ketika mengubah kod Java yang ada. Kotlin mempunyai kelas dengan pembina, bersama dengan kelas dalaman bersarang, dalaman, dan tanpa nama, dan ia mempunyai antara muka seperti Java 8. Kotlin tidak mempunyai newkata kunci. Untuk membuat contoh kelas, panggil konstruktor seperti fungsi biasa. Kami melihatnya dalam tangkapan skrin di atas.

Kotlin mempunyai warisan tunggal dari superclass bernama, dan semua kelas Kotlin memiliki superclass default Any, yang tidak sama dengan kelas dasar Java java.lang.Object. Anymengandungi hanya tiga fungsi ahli yang telah ditetapkan: equals(), hashCode(), dan toString().

Kelas Kotlin mesti ditandai dengan openkata kunci untuk membolehkan kelas lain mewarisi dari mereka; Kelas Java adalah sebaliknya, kerana mereka boleh diwarisi kecuali ditandai dengan finalkata kunci. Untuk mengatasi kaedah superclass, kaedah itu sendiri mesti ditandakan open, dan kaedah subkelas mesti ditandakan override. Ini semua sesuai dengan falsafah Kotlin untuk membuat sesuatu yang eksplisit dan bukannya bergantung pada default Dalam kes tertentu ini, saya dapat melihat di mana cara Kotlin secara eksplisit menandakan anggota kelas dasar sebagai terbuka untuk warisan dan ahli kelas turunan sebagai pengganti mengelakkan beberapa jenis kesalahan Java yang biasa.

Ciri keselamatan di Kotlin

Berbicara untuk mengelakkan kesalahan biasa, Kotlin dirancang untuk menghilangkan bahaya rujukan penunjuk nol dan menyederhanakan pengendalian nilai nol. Ia melakukannya dengan membuat yang nulltidak sah untuk jenis standard, menambahkan jenis yang tidak dapat ditolak, dan menerapkan notasi jalan pintas untuk menangani ujian untuk nol.

Sebagai contoh, jenis pemboleh ubah biasa  tidak dapat menahan  :String null

var a: String = "abc"

ralat penyusunan = null //

Sekiranya anda perlu membiarkan nol, misalnya untuk menahan hasil pertanyaan SQL, anda boleh menyatakan jenis nullable dengan menambahkan tanda tanya pada jenisnya, mis String?.

var  b: Rentetan?

b = batal  // ok

Perlindungan melangkah lebih jauh. Anda boleh menggunakan jenis yang tidak boleh ditolak dengan impuniti, tetapi anda harus menguji jenis yang tidak dapat ditolak untuk nilai nol sebelum menggunakannya.

Untuk mengelakkan tatabahasa verbose yang biasanya diperlukan untuk ujian nol, Kotlin memperkenalkan panggilan selamat , bertulis ?.. Contohnya, mengembalikan jika tidak , dan sebaliknya. Jenis ungkapan ini adalah .b?.length b.lengthbnullnullInt?

Dengan kata lain, b?.lengthadalah jalan pintas untuk if (b != null) b.length else null. Sintaks ini berantai dengan baik, menghilangkan banyak logik prolix, terutama ketika suatu objek diisi dari serangkaian pertanyaan pangkalan data, yang mana mungkin gagal. Sebagai contoh, bob?.department?.head?.nameakan mengembalikan nama ketua jabatan Bob jika Bob, ketua jabatan, dan ketua jabatan semuanya tidak batal.

Untuk melakukan operasi tertentu hanya untuk nilai bukan nol, anda boleh menggunakan operator panggilan selamat ?.bersama dengan  let:

val listWithNulls: List = listOf ("A", null)

untuk (item dalam listWithNulls) {

      item? .let {println (it)} // mencetak A dan mengabaikan nol}

Selalunya anda ingin mengembalikan nilai yang sah tetapi istimewa dari ungkapan yang tidak dapat ditolak, biasanya supaya anda dapat menyimpannya menjadi jenis yang tidak boleh dibatalkan. Terdapat sintaks khas untuk ini yang disebut operator Elvis (saya tidak suka), ditulis ?:.

val l = b? .lagi?: -1

adalah setara dengan 

val l: Int = if (b! = null) b. panjang lain -1

Dengan cara yang sama, Kotlin menghilangkan pengecualian yang diperiksa oleh Java, yang merupakan keadaan boleh dilempar yang harus ditangkap. Contohnya, tandatangan JDK

Appendend appendable (CharSequence csq) melemparkan  IOException;

menghendaki anda menangkap IOExceptionsetiap kali anda memanggil appendkaedah:

cuba {

  log.append (mesej)

}

tangkapan (IOException e) {

  // Lakukan sesuatu dengan pengecualian

}

Pereka Java menganggap ini adalah idea yang baik, dan itu adalah kemenangan bersih untuk program mainan, selagi pengaturcara menerapkan sesuatu yang masuk akal dalam catchklausa tersebut. Semua terlalu kerap dalam program Java besar, bagaimanapun, anda melihat kod di mana mandatori catchfasal mengandungi apa-apa tetapi komen: //todo: handle this. Ini tidak membantu sesiapa pun, dan pengecualian yang diperiksa ternyata merupakan kerugian bersih untuk program besar.

Kotout coroutine

Coroutine di Kotlin pada dasarnya adalah benang ringan. Anda memulakannya dengan pembangun launchcoroutine dalam konteks beberapa CoroutineScope. Salah satu ruang lingkup coroutine yang paling berguna adalah runBlocking{}, yang berlaku untuk ruang lingkup blok kodnya.

import kotlinx.coroutines. *

fun main () = runBlocking {// ini: CoroutineScope

    melancarkan {// melancarkan coroutine baru dalam skop runBlocking

        kelewatan (1000L) // kelewatan tanpa sekatan selama 1 saat

        println ("Dunia!")

    }

    println ("Helo,")

}

Kod ini menghasilkan output berikut, dengan kelewatan satu saat antara baris:

Helo,

Dunia!

Kotlin untuk Android

Sehingga Mei 2017, satu-satunya bahasa pengaturcaraan yang disokong secara rasmi untuk Android adalah Java dan C ++. Google mengumumkan sokongan rasmi untuk Kotlin pada Android di Google I / O 2017, dan bermula dengan Android Studio 3.0 Kotlin dimasukkan ke dalam set alat pengembangan Android. Kotlin dapat ditambahkan ke Android Studio versi sebelumnya dengan pemalam.

Kotlin menyusun kod byte yang sama dengan Java, beroperasi dengan kelas Java dengan cara semula jadi, dan berkongsi perkakasnya dengan Java. Oleh karena tidak ada overhead untuk memanggil bolak-balik antara Kotlin dan Java, menambahkan Kotlin secara bertahap ke aplikasi Android saat ini di Java masuk akal. Beberapa kes di mana interoperabilitas antara Kotlin dan kod Java tidak mempunyai rahmat, seperti sifat set-Java sahaja, jarang ditemui dan mudah diperbaiki.

Pinterest adalah anak poster untuk aplikasi Android yang ditulis di Kotlin pada awal November 2016, dan itu disebut dengan jelas di Google I / O 2017 sebagai sebahagian daripada pengumuman Kotlin. Selain itu, pasukan Kotlin suka memetik aplikasi Evernote, Trello, Square, dan Coursera untuk Android.

Kotlin lwn Jawa

Persoalan apakah memilih Kotlin atau Java untuk pengembangan baru telah banyak muncul di komunitas Android sejak pengumuman Google I / O, walaupun orang sudah mengajukan pertanyaan pada Februari 2016 ketika Kotlin 1.0 dikirim. Jawapan ringkasnya adalah bahawa kod Kotlin lebih selamat dan lebih ringkas daripada kod Java, dan bahawa fail Kotlin dan Java dapat wujud bersama dalam aplikasi Android, sehingga Kotlin tidak hanya berguna untuk aplikasi baru, tetapi juga untuk memperluas aplikasi Java yang ada.

Satu-satunya hujah yang tepat yang saya lihat untuk memilih Java daripada Kotlin adalah untuk pemula pembangunan Android yang lengkap. Bagi mereka, mungkin ada penghalang untuk mengatasi memandangkan, secara historis, kebanyakan dokumentasi dan contoh Android ada di Java. Sebaliknya, mengubah Java menjadi Kotlin di Android Studio adalah perkara mudah untuk menyisipkan kod Java ke dalam file Kotlin.

Bagi hampir semua orang yang melakukan pembangunan Android, kelebihan Kotlin sangat menarik. Waktu biasa yang dikutip untuk pengembang Java untuk belajar Kotlin adalah beberapa jam ā€” harga yang kecil untuk membayar untuk menghilangkan kesalahan rujukan nol, mengaktifkan fungsi peluasan, menyokong pengaturcaraan fungsional, dan menambahkan coroutine. Anggaran kasar khas menunjukkan kira-kira 40 peratus pemotongan bilangan baris kod dari Jawa ke Kotlin.