Sepuluh Fitur Kotlin untuk Meningkatkan Pengembangan Android
Diterbitkan: 2022-03-11pengantar
Beberapa waktu lalu, Tomasz memperkenalkan pengembangan Kotlin di Android. Untuk mengingatkan Anda: Kotlin adalah bahasa pemrograman baru yang dikembangkan oleh Jetbrains, perusahaan di balik salah satu IDE Java paling populer, IntelliJ IDEA. Seperti Java, Kotlin adalah bahasa tujuan umum. Karena mematuhi bytecode Java Virtual Machine (JVM), ini dapat digunakan berdampingan dengan Java, dan tidak disertai dengan overhead kinerja.
Pada artikel ini, saya akan membahas 10 fitur teratas yang berguna untuk meningkatkan pengembangan Android Anda.
Catatan : pada saat artikel ini ditulis, versi sebenarnya adalah Android Studio 2.1.1. dan Kotlin 1.0.2.
Pengaturan Kotlin
Karena Kotlin dikembangkan oleh JetBrains, ia didukung dengan baik di Android Studio dan IntelliJ.
Langkah pertama adalah menginstal plugin Kotlin. Setelah berhasil melakukannya, tindakan baru akan tersedia untuk mengonversi Java Anda ke Kotlin. Dua opsi baru adalah:
- Buat proyek Android baru dan siapkan Kotlin di proyek.
- Tambahkan dukungan Kotlin ke proyek Android yang ada.
Untuk mempelajari cara membuat proyek Android baru, lihat panduan langkah demi langkah resmi. Untuk menambahkan dukungan Kotlin ke proyek yang baru dibuat atau yang sudah ada, buka dialog temukan tindakan menggunakan Command + Shift + A
di Mac atau Ctrl + Shift + A
di Windows/Linux, dan aktifkan tindakan Configure Kotlin in Project
.
Untuk membuat kelas Kotlin baru, pilih:
-
File
>New
>Kotlin file/class
, atau -
File
>New
>Kotlin activity
Atau, Anda dapat membuat kelas Java dan mengonversinya menjadi Kotlin menggunakan tindakan yang disebutkan di atas. Ingat, Anda dapat menggunakannya untuk mengonversi kelas, antarmuka, enum, atau anotasi apa pun, dan ini dapat digunakan untuk membandingkan Java dengan kode Kotlin dengan mudah.
Elemen berguna lainnya yang menghemat banyak pengetikan adalah ekstensi Kotlin. Untuk menggunakannya, Anda harus menerapkan plugin lain di file modul build.gradle
Anda:
apply plugin: 'kotlin-android-extensions'
Peringatan : jika Anda menggunakan tindakan plugin Kotlin untuk menyiapkan proyek Anda, itu akan menempatkan kode berikut di file build.gradle
tingkat atas Anda:
buildscript { ext.kotlin_version = '1.0.2' repositories { jcenter() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }
Ini akan menyebabkan ekstensi tidak berfungsi. Untuk memperbaikinya, cukup salin kode itu ke setiap modul proyek tempat Anda ingin menggunakan Kotlin.
Jika Anda menyiapkan semuanya dengan benar, Anda seharusnya dapat menjalankan dan menguji aplikasi Anda dengan cara yang sama seperti yang Anda lakukan di proyek Android standar, tetapi sekarang menggunakan Kotlin.
Menghemat Waktu dengan Kotlin
Jadi, mari kita mulai dengan menjelaskan beberapa aspek kunci dari bahasa Kotlin dan dengan memberikan tips tentang bagaimana Anda dapat menghemat waktu dengan menggunakannya daripada Java.
Fitur #1: Impor Tata Letak Statis
Salah satu kode boilerplate paling umum di Android menggunakan fungsi findViewById()
untuk mendapatkan referensi ke tampilan Anda di Aktivitas atau Fragmen.
Ada solusi, seperti pustaka Butterknife, yang menghemat pengetikan, tetapi Kotlin mengambil langkah lain dengan mengizinkan Anda mengimpor semua referensi ke tampilan dari tata letak dengan satu impor.
Misalnya, pertimbangkan tata letak XML aktivitas berikut:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:andro xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="co.ikust.kotlintest.MainActivity"> <TextView android: android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout>
Dan kode aktivitas yang menyertainya:
package co.ikust.kotlintest import android.support.v7.app.AppCompatActivity import android.os.Bundle import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) helloWorldTextView.text = "Hello World!" } }
Untuk mendapatkan referensi untuk semua tampilan dalam tata letak dengan ID yang ditentukan, gunakan ekstensi Android Kotlin Anko. Ingatlah untuk mengetikkan pernyataan impor ini:
import kotlinx.android.synthetic.main.activity_main.*
Perhatikan bahwa Anda tidak perlu menulis titik koma di akhir baris di Kotlin karena bersifat opsional.
TextView
dari layout diimpor sebagai instance TextView
dengan nama yang sama dengan ID tampilan. Jangan bingung dengan sintaks yang digunakan untuk mengatur label:
helloWorldTextView.text = "Hello World!"
Kami akan membahasnya segera.
Peringatan :
- Pastikan Anda mengimpor tata letak yang benar, jika tidak, referensi Tampilan yang diimpor akan memiliki nilai
null
. - Saat menggunakan fragmen, pastikan referensi View yang diimpor digunakan setelah pemanggilan fungsi
onCreateView()
. Impor tata letak dalam fungsionCreateView()
dan gunakan referensi Tampilan untuk menyiapkan UI dionViewCreated()
. Referensi tidak akan ditetapkan sebelum metodeonCreateView()
selesai.
Fitur #2: Menulis Kelas POJO dengan Kotlin
Sesuatu yang paling menghemat waktu dengan Kotlin adalah menulis kelas POJO (Objek Jawa Lama Biasa) yang digunakan untuk menyimpan data. Misalnya, di badan permintaan dan respons dari RESTful API. Pada aplikasi yang mengandalkan RESTful API, akan ada banyak class seperti itu.
Di Kotlin, banyak yang dilakukan untuk Anda, dan sintaksnya ringkas. Misalnya, pertimbangkan kelas berikut di Java:
public class User { private String firstName; private String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
Saat bekerja dengan Kotlin, Anda tidak perlu menulis kata kunci publik lagi. Secara default, semuanya dalam lingkup publik. Misalnya, jika Anda ingin mendeklarasikan kelas, Anda cukup menulis:
class MyClass { }
Setara dengan kode Java di atas di Kotlin:
class User { var firstName: String? = null var lastName: String? = null }
Nah, itu menghemat banyak mengetik, bukan? Mari kita telusuri kode Kotlin.
Saat mendefinisikan variabel di Kotlin, ada dua opsi:
- Variabel yang dapat diubah, ditentukan oleh kata kunci
var
. - Variabel yang tidak dapat diubah, ditentukan oleh kata kunci
val
.
Hal berikutnya yang perlu diperhatikan adalah sintaksnya sedikit berbeda dari Java; pertama, Anda mendeklarasikan nama variabel dan kemudian diikuti dengan tipe. Juga, secara default, properti adalah tipe non-null, artinya mereka tidak dapat menerima nilai null
. Untuk mendefinisikan variabel untuk menerima nilai null
, tanda tanya harus ditambahkan setelah jenisnya. Kami akan membicarakan hal ini dan keamanan nol di Kotlin nanti.
Hal penting lainnya yang perlu diperhatikan adalah bahwa Kotlin tidak memiliki kemampuan untuk mendeklarasikan bidang untuk kelas; hanya properti yang dapat ditentukan. Jadi, dalam hal ini, firstName
dan lastName
adalah properti yang telah ditetapkan metode pengambil/penyetel default. Seperti yang disebutkan, di Kotlin, keduanya bersifat publik secara default.
Aksesor khusus dapat ditulis, misalnya:
class User { var firstName: String? = null var lastName: String? = null val fullName: String? get() firstName + " " + lastName }
Dari luar, dalam hal sintaks, properti berperilaku seperti bidang publik di Jawa:
val userName = user.firstName user.firstName = "John"
Perhatikan bahwa nama lengkap properti fullName
hanya dapat dibaca (ditentukan oleh kata kunci val
) dan memiliki pengambil khusus; itu hanya menambahkan nama depan dan belakang.
Semua properti di Kotlin harus ditetapkan saat dideklarasikan atau berada dalam konstruktor. Ada beberapa kasus ketika itu tidak nyaman; misalnya, untuk properti yang akan diinisialisasi melalui injeksi ketergantungan. Dalam hal ini, pengubah lateinit
dapat digunakan. Berikut ini contohnya:
class MyClass { lateinit var firstName : String; fun inject() { firstName = "John"; } }
Rincian lebih lanjut tentang properti dapat ditemukan di dokumentasi resmi.
Fitur #3: Warisan dan Konstruktor Kelas
Kotlin juga memiliki sintaks yang lebih ringkas dalam hal konstruktor.
Konstruktor
Kelas Kotlin memiliki konstruktor utama dan satu atau lebih konstruktor sekunder. Contoh mendefinisikan konstruktor utama:
class User constructor(firstName: String, lastName: String) { }
Konstruktor utama mengikuti nama kelas dalam definisi kelas. Jika konstruktor utama tidak memiliki anotasi atau pengubah visibilitas, kata kunci konstruktor dapat dihilangkan:
class Person(firstName: String) { }
Perhatikan bahwa konstruktor utama tidak dapat memiliki kode apa pun; inisialisasi apa pun harus dilakukan di blok kode init
:
class Person(firstName: String) { init { //perform primary constructor initialization here } }
Selanjutnya, konstruktor utama dapat digunakan untuk mendefinisikan dan menginisialisasi properti:
class User(var firstName: String, var lastName: String) { // ... }
Sama seperti yang biasa, properti yang ditentukan dari konstruktor utama bisa tidak berubah ( val
) atau bisa berubah ( var
).
Kelas mungkin memiliki konstruktor sekunder juga; sintaks untuk mendefinisikan satu adalah sebagai berikut:
class User(var firstName: String, var lastName) { constructor(name: String, parent: Person) : this(name) { parent.children.add(this) } }
Perhatikan bahwa setiap konstruktor sekunder harus didelegasikan ke konstruktor utama. Ini mirip dengan Java, yang menggunakan kata kunci this
:
class User(val firstName: String, val lastName: String) { constructor(firstName: String) : this(firstName, "") { //... } }
Saat membuat instance kelas, perhatikan bahwa Kotlin tidak memiliki kata kunci new
, seperti halnya Java. Untuk membuat instance kelas User
yang disebutkan di atas, gunakan:
val user = User("John", "Doe)
Memperkenalkan Warisan
Di Kotlin, semua kelas diperluas dari Any
, yang mirip dengan Object
di Java. Secara default, kelas ditutup, seperti kelas akhir di Jawa. Jadi, untuk memperluas kelas, itu harus dideklarasikan sebagai open
atau abstract
:
open class User(val firstName, val lastName) class Administrator(val firstName, val lastName) : User(firstName, lastName)
Perhatikan bahwa Anda harus mendelegasikan ke konstruktor default dari kelas yang diperluas, yang mirip dengan memanggil metode super()
di konstruktor kelas baru di Java.
Untuk detail lebih lanjut tentang kelas, periksa dokumentasi resmi.
Fitur #4: Ekspresi Lambda
Ekspresi Lambda, diperkenalkan dengan Java 8, adalah salah satu fitur favoritnya. Namun, hal-hal tidak begitu cerah di Android, karena masih hanya mendukung Java 7, dan sepertinya Java 8 tidak akan didukung dalam waktu dekat. Jadi, solusi, seperti Retrolambda, membawa ekspresi lambda ke Android.
Dengan Kotlin, tidak diperlukan library atau solusi tambahan.
Fungsi di Kotlin
Mari kita mulai dengan cepat membahas sintaks fungsi di Kotlin:
fun add(x: Int, y: Int) : Int { return x + y }
Nilai kembalian fungsi dapat dihilangkan, dan dalam hal ini, fungsi akan mengembalikan Int
. Perlu diulang bahwa semua yang ada di Kotlin adalah objek, diperluas dari Any
, dan tidak ada tipe primitif.
Argumen fungsi dapat memiliki nilai default, misalnya:
fun add(x: Int, y: Int = 1) : Int { return x + y; }
Dalam hal ini, fungsi add()
dapat dipanggil dengan hanya meneruskan argumen x
. Kode Java yang setara adalah:
int add(int x) { Return add(x, 1); } int add(int x, int y) { return x + y; }
Hal menyenangkan lainnya saat memanggil fungsi adalah argumen bernama dapat digunakan. Sebagai contoh:
add(y = 12, x = 5)
Untuk detail lebih lanjut tentang fungsi, periksa dokumentasi resmi.
Menggunakan Ekspresi Lambda di Kotlin
Ekspresi Lambda di Kotlin dapat dilihat sebagai fungsi anonim di Java, tetapi dengan sintaks yang lebih ringkas. Sebagai contoh, mari tunjukkan cara mengimplementasikan pendengar klik di Java dan Kotlin.
Di Jawa:
view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(v.getContext(), "Clicked on view", Toast.LENGTH_SHORT).show(); } };
Di Kotlin:
view.setOnClickListener({ view -> toast("Click") })
Wow! Hanya satu baris kode! Kita dapat melihat bahwa ekspresi lambda dikelilingi oleh kurung kurawal. Parameter dideklarasikan terlebih dahulu, dan isi mengikuti tanda ->
. Dengan pendengar klik, jenis untuk parameter tampilan tidak ditentukan karena dapat disimpulkan. Tubuh hanyalah fungsi panggilan ke toast()
untuk menampilkan toast, yang disediakan Kotlin.
Juga, jika parameter tidak digunakan, kita dapat mengabaikannya:
view.setOnClickListener({ toast("Click") })
Kotlin telah mengoptimalkan pustaka Java, dan fungsi apa pun yang menerima antarmuka dengan satu metode untuk argumen dapat dipanggil dengan argumen fungsi (bukan Antarmuka).

Selanjutnya, jika fungsi adalah parameter terakhir, fungsi tersebut dapat dipindahkan dari tanda kurung:
view.setOnClickListener() { toast("Click") }
Terakhir, jika fungsi hanya memiliki satu parameter yaitu fungsi, tanda kurung dapat ditinggalkan:
view.setOnClickListener { toast("Click") }
Untuk informasi lebih lanjut, lihat buku Kotlin untuk pengembang Android oleh Antonio Leiva dan dokumentasi resmi.
Fungsi Ekstensi
Kotlin, mirip dengan C#, menyediakan kemampuan untuk memperluas kelas yang ada dengan fungsionalitas baru dengan menggunakan fungsi ekstensi. Misalnya, metode ekstensi yang akan menghitung hash MD5 dari sebuah String
:
fun String.md5(): ByteArray { val digester = MessageDigest.getInstance("MD5") digester.update(this.toByteArray(Charset.defaultCharset())) return digester.digest() }
Perhatikan bahwa nama fungsi didahului dengan nama kelas yang diperluas (dalam hal ini, String
), dan bahwa turunan dari kelas yang diperluas tersedia melalui kata kunci this
.
Fungsi ekstensi setara dengan fungsi utilitas Java. Contoh fungsi di Java akan terlihat seperti:
public static int toNumber(String instance) { return Integer.valueOf(instance); }
Contoh fungsi harus ditempatkan di kelas Utilitas. Artinya adalah bahwa fungsi ekstensi tidak mengubah kelas asli yang diperluas, tetapi merupakan cara yang nyaman untuk menulis metode utilitas.
Fitur #5: Null-safety
Salah satu hal yang paling Anda buru di Jawa mungkin adalah NullPointerException
. Null-safety adalah fitur yang telah terintegrasi ke dalam bahasa Kotlin dan sangat implisit yang biasanya tidak perlu Anda khawatirkan. Dokumentasi resmi menyatakan bahwa satu-satunya kemungkinan penyebab NullPointerExceptions
adalah:
- Panggilan eksplisit untuk melempar
NullPointerException
. - Menggunakan
!!
operator (yang akan saya jelaskan nanti). - Kode Java eksternal.
- Jika properti
lateinit
diakses di konstruktor sebelum diinisialisasi,UninitializedPropertyAccessException
akan dilempar.
Secara default, semua variabel dan properti di Kotlin dianggap non-null
(tidak dapat menyimpan nilai null
) jika tidak secara eksplisit dinyatakan sebagai nullable. Seperti yang telah disebutkan, untuk mendefinisikan variabel untuk menerima nilai null
, tanda tanya harus ditambahkan setelah jenisnya. Sebagai contoh:
val number: Int? = null
Namun, perhatikan bahwa kode berikut tidak dapat dikompilasi:
val number: Int? = null number.toString()
Ini karena kompiler melakukan pemeriksaan null
. Untuk mengkompilasi, cek null
harus ditambahkan:
val number: Int? = null if(number != null) { number.toString(); }
Kode ini akan berhasil dikompilasi. Apa yang dilakukan Kotlin di latar belakang, dalam hal ini, adalah number
tersebut menjadi nun-null
( Int
bukannya Int?
) di dalam blok if.
Pemeriksaan null
dapat disederhanakan menggunakan operator panggilan aman ( ?.
):
val number: Int? = null number?.toString()
Baris kedua akan dieksekusi hanya jika nomornya bukan null
. Anda bahkan dapat menggunakan operator Elvis yang terkenal ( ?:
):
val number Int? = null val stringNumber = number?.toString() ?: "Number is null"
Jika ekspresi di sebelah kiri ?:
bukan null
, ekspresi tersebut dievaluasi dan dikembalikan. Jika tidak, hasil ekspresi di sebelah kanan akan dikembalikan. Hal menarik lainnya adalah Anda dapat menggunakan throw
atau return
di sisi kanan operator Elvis karena mereka adalah ekspresi di Kotlin. Sebagai contoh:
fun sendMailToUser(user: User) { val email = user?.email ?: throw new IllegalArgumentException("User email is null") //... }
!! Operator
Jika Anda ingin NullPointerException
dilempar dengan cara yang sama seperti di Java, Anda bisa melakukannya dengan !!
operator. Kode berikut akan menampilkan NullPointerException
:
val number: Int? = null number!!.toString()
Pengecoran
Casting in dilakukan dengan menggunakan kata kunci as
:
val x: String = y as String
Ini dianggap casting "Tidak Aman", karena akan membuang ClassCastException
jika pemeran tidak memungkinkan, seperti yang dilakukan Java. Ada operator pemeran "Aman" yang mengembalikan nilai null
alih-alih melempar pengecualian:
val x: String = y as? String
Untuk detail lebih lanjut tentang casting, periksa bagian Type Casts and Casts dari dokumentasi resmi, dan untuk detail lebih lanjut tentang keamanan null
, periksa bagian Null-Safety.
sifat lateinit
Ada kasus di mana menggunakan properti lateinit
dapat menyebabkan pengecualian yang mirip dengan NullPointerException
. Pertimbangkan kelas berikut:
class InitTest { lateinit var s: String; init { val len = this.s.length } }
Kode ini akan dikompilasi tanpa peringatan. Namun, segera setelah instance TestClass
dibuat, UninitializedPropertyAccessException
akan dilempar karena properti s
diakses sebelum diinisialisasi.
Fitur #6: Fungsi with()
Fungsi with()
berguna dan dilengkapi dengan pustaka standar Kotlin. Ini dapat digunakan untuk menyimpan beberapa pengetikan jika Anda perlu mengakses banyak properti dari suatu objek. Sebagai contoh:
with(helloWorldTextView) { text = "Hello World!" visibility = View.VISIBLE }
Ia menerima objek dan fungsi ekstensi sebagai parameter. Blok kode (dalam kurung kurawal) adalah ekspresi lambda untuk fungsi ekstensi dari objek yang ditentukan sebagai parameter pertama.
Fitur #7: Operator Overloading
Dengan Kotlin, implementasi kustom dapat disediakan untuk sekumpulan operator yang telah ditentukan sebelumnya. Untuk mengimplementasikan operator, fungsi anggota atau fungsi ekstensi dengan nama yang diberikan harus disediakan.
Misalnya, untuk mengimplementasikan operator perkalian, fungsi anggota atau fungsi ekstensi, dengan nama times(argument)
, harus disediakan:
operator fun String.times(b: Int): String { val buffer = StringBuffer() for (i in 1..b) { buffer.append(this) } return buffer.toString() }
Contoh di atas menunjukkan implementasi dari operator *
biner pada String
. Misalnya, ekspresi berikut akan menetapkan nilai "TestTestTestTest" ke variabel newString
:
val newString = "Test" * 4
Karena fungsi ekstensi dapat digunakan, itu berarti perilaku default operator untuk semua objek dapat diubah. Ini adalah pedang bermata dua dan harus digunakan dengan hati-hati. Untuk daftar nama fungsi untuk semua operator yang dapat kelebihan beban, periksa dokumentasi resmi.
Perbedaan besar lainnya dibandingkan dengan Java adalah operator ==
dan !=
. Operator ==
diterjemahkan menjadi:
a?.equals(b) ?: b === null
Sementara operator !=
diterjemahkan menjadi:
!(a?.equals(b) ?:
Artinya, apakah menggunakan ==
tidak membuat pemeriksaan identitas seperti di Java (bandingkan jika instance objek sama), tetapi berperilaku dengan cara yang sama seperti metode equals()
bersama dengan pemeriksaan null
.
Untuk melakukan pemeriksaan identitas, operator ===
dan !==
harus digunakan di Kotlin.
Fitur #8: Properti yang Didelegasikan
Properti tertentu berbagi beberapa perilaku umum. Contohnya:
- Properti yang diinisialisasi malas yang diinisialisasi pada akses pertama.
- Properti yang mengimplementasikan Observable dalam pola Observer.
- Properti yang disimpan di peta bukan sebagai bidang terpisah.
Untuk membuat kasus seperti ini lebih mudah diterapkan, Kotlin mendukung Delegated Properties :
class SomeClass { var p: String by Delegate() }
Ini berarti bahwa fungsi pengambil dan penyetel untuk properti p
ditangani oleh turunan dari kelas lain, Delegate
.
Contoh delegasi untuk properti String
:
class Delegate { operator fun getValue(thisRef: Any?, property: KProperty<*>): String { return "$thisRef, thank you for delegating '${property.name}' to me!" } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) { println("$value has been assigned to '${property.name} in $thisRef.'") } }
Contoh di atas mencetak pesan saat properti ditetapkan atau dibaca.
Delegasi dapat dibuat untuk properti yang dapat diubah ( var
) dan hanya-baca ( val
).
Untuk properti read-only, metode getValue
harus diimplementasikan. Dibutuhkan dua parameter (diambil dari dokumentasi resmi):
- penerima - harus sama atau supertipe dari pemilik properti (untuk properti ekstensi, itu adalah tipe yang diperpanjang).
- metadata - harus bertipe
KProperty<*>
atau supertipenya.
Fungsi ini harus mengembalikan tipe yang sama dengan properti, atau subtipenya.
Untuk properti yang dapat diubah, delegasi harus menyediakan tambahan fungsi bernama setValue
yang mengambil parameter berikut:
- penerima - sama seperti untuk
getValue()
. - metadata - sama seperti untuk
getValue()
. - nilai baru - harus bertipe sama dengan properti atau supertipenya.
Ada beberapa delegasi standar yang disertakan dengan Kotlin yang mencakup situasi paling umum:
- Malas
- Tampak
- Dapat diveto
Malas
Malas adalah delegasi standar yang menggunakan ekspresi lambda sebagai parameter. Ekspresi lambda yang diteruskan dieksekusi saat pertama kali metode getValue()
dipanggil.
Secara default, evaluasi properti malas disinkronkan. Jika Anda tidak peduli dengan multi-threading, Anda dapat menggunakan lazy(LazyThreadSafetyMode.NONE) { … }
untuk mendapatkan kinerja ekstra.
Tampak
Delegates.observable()
adalah untuk properti yang harus berperilaku sebagai Observables dalam pola Observer. Ia menerima dua parameter, nilai awal dan fungsi yang memiliki tiga argumen (properti, nilai lama, dan nilai baru).
Ekspresi lambda yang diberikan akan dieksekusi setiap kali metode setValue()
dipanggil:
class User { var email: String by Delegates.observable("") { prop, old, new -> //handle the change from old to new value } }
Dapat diveto
Delegasi standar ini adalah jenis Observable khusus yang memungkinkan Anda memutuskan apakah nilai baru yang ditetapkan ke properti akan disimpan atau tidak. Ini dapat digunakan untuk memeriksa beberapa kondisi sebelum menetapkan nilai. Seperti halnya Delegates.observable()
, ia menerima dua parameter: nilai awal, dan fungsi.
Perbedaannya adalah bahwa fungsi mengembalikan nilai Boolean. Jika mengembalikan true
, nilai baru yang ditetapkan ke properti akan disimpan, atau dibuang.
var positiveNumber = Delegates.vetoable(0) { d, old, new -> new >= 0 }
Contoh yang diberikan hanya akan menyimpan angka positif yang ditetapkan ke properti.
Untuk detail lebih lanjut, periksa dokumentasi resmi.
Fitur #9: Memetakan Objek ke Peta
Kasus penggunaan yang umum adalah untuk menyimpan nilai properti di dalam peta. Ini sering terjadi pada aplikasi yang bekerja dengan RESTful API dan mem-parsing objek JSON. Dalam hal ini, instance peta dapat digunakan sebagai delegasi untuk properti yang didelegasikan. Contoh dari dokumentasi resmi:
class User(val map: Map<String, Any?>) { val name: String by map val age: Int by map }
Dalam contoh ini, User
memiliki konstruktor utama yang mengambil peta. Kedua properti akan mengambil nilai dari peta yang dipetakan di bawah kunci yang sama dengan nama properti:
val user = User(mapOf( "name" to "John Doe", "age" to 25 ))
Properti nama dari instance pengguna baru akan diberi nilai "John Doe" dan properti usia nilai 25.
Ini berfungsi untuk properti var dalam kombinasi dengan MutableMap
juga:
class MutableUser(val map: MutableMap<String, Any?>) { var name: String by map var age: Int by map }
Fitur #10: Koleksi dan Operasi Fungsional
Dengan dukungan lambda di Kotlin, koleksi dapat ditingkatkan ke tingkat yang baru.
Pertama-tama, Kotlin membedakan antara koleksi yang dapat berubah dan yang tidak dapat diubah. Misalnya, ada dua versi antarmuka Iterable :
- dapat diubah
- Bisa Diubah
Hal yang sama berlaku untuk antarmuka Collection , List , Set dan Map .
Misalnya, operasi any
ini mengembalikan nilai true
jika setidaknya satu elemen cocok dengan predikat yang diberikan:
val list = listOf(1, 2, 3, 4, 5, 6) assertTrue(list.any { it % 2 == 0 })
Untuk daftar ekstensif operasi fungsional yang dapat dilakukan pada koleksi, periksa posting blog ini.
Kesimpulan
Kami baru saja menggores permukaan dari apa yang ditawarkan Kotlin. Bagi mereka yang tertarik untuk membaca lebih lanjut dan mempelajari lebih lanjut, periksa:
- Entri dan buku blog Kotlin Antonio Leiva.
- Dokumentasi dan tutorial resmi dari JetBrains.
Singkatnya, Kotlin menawarkan Anda kemampuan untuk menghemat waktu saat menulis aplikasi Android asli dengan menggunakan sintaks yang intuitif dan ringkas. Ini masih bahasa pemrograman yang masih muda, tetapi menurut saya, sekarang cukup stabil untuk digunakan untuk membangun aplikasi produksi.
Manfaat menggunakan Kotlin:
- Dukungan oleh Android Studio mulus dan luar biasa.
- Sangat mudah untuk mengonversi proyek Java yang ada ke Kotlin.
- Kode Java dan Kotlin mungkin ada dalam proyek yang sama.
- Tidak ada overhead kecepatan dalam aplikasi.
Kekurangannya:
- Kotlin akan menambahkan perpustakaannya ke
.apk
yang dihasilkan, sehingga ukuran.apk
akhir akan menjadi sekitar 300KB lebih besar. - Jika disalahgunakan, kelebihan operator dapat menyebabkan kode tidak terbaca.
- IDE dan Autocomplete berperilaku sedikit lebih lambat saat bekerja dengan Kotlin dibandingkan dengan proyek Java Android murni.
- Waktu kompilasi bisa sedikit lebih lama.