Properti extension (extension property) menambahkan properti pada tipe yang sudah ada dengan deklarasi val Tipe.nama atau var Tipe.nama, sedangkan fungsi infix memanggil fungsi tanpa titik dan tanpa tanda kurung. Keduanya membuat pemanggilan terbaca seperti kalimat, dan gaya inilah yang menjadi dasar penyusunan DSL (domain specific language) di Kotlin. Topik ini membahas deklarasi properti extension beserta batasannya, syarat fungsi infix, serta kedudukan infix terhadap operator lain. Seluruh contoh dieksekusi dengan compiler Kotlin sehingga keluarannya nyata.
Properti extension#
Properti extension dideklarasikan seperti properti kelas, tetapi tidak memiliki backing field sehingga wajib menyediakan getter secara manual. Karena tidak ada tempat untuk menyimpan nilai, getter hanya dapat menghitung hasilnya dari anggota tipe penerima yang terlihat dari luar. Deklarasi var juga sah, tetapi setter-nya pun tidak menyimpan nilai apa pun, melainkan hanya menerjemahkan penugasan menjadi operasi tertentu pada penerimanya.
Program berikut menambahkan properti inisial pada String. Properti ini memecah string menjadi kata, mengambil huruf pertama setiap kata, lalu menggabungkannya dalam huruf kapital.
val String.inisial: String
get() = split(" ")
.mapNotNull { it.firstOrNull() }
.joinToString("")
.uppercase()
fun main() {
println("Ali Budi Santoso".inisial)
println("jadwal piket".inisial)
}# compiler Kotlin dan pustaka standar yang dipakai jalur ini
export PATH=/home/kal/my-project/tools/kotlinc/bin:/home/kal/my-project/tools/jdk-merged/bin:$PATH
export STDLIB=/home/kal/my-project/tools/kotlinc/lib/kotlin-stdlib.jar
# kompilasi berkas main.kt menjadi out.jar, lalu jalankan programnya
kotlinc main.kt -d out.jar && java -cp "out.jar:$STDLIB" MainKtABS
JPPemanggilan "Ali Budi Santoso".inisial menghasilkan ABS, sedangkan "jadwal piket".inisial menghasilkan JP. Fungsi mapNotNull menyaring kata kosong yang muncul apabila string memuat spasi ganda, sehingga hasil gabungannya tetap rapat tanpa celah. Penulisan inisial tanpa tanda kurung membuat pemanggilannya terbaca seperti properti biasa, padahal seluruh perhitungan baru dijalankan pada setiap akses.
Sifat pemakaian properti extension sama dengan fungsi extension pada bagian resolusinya, yaitu dipilih compiler dari tipe yang tertulis dan tidak menambahkan anggota ke kelas asalnya. Properti ini juga tidak dapat mengakses anggota private dari penerimanya, sehingga perhitungan getter semata-mata bertumpu pada API publik tipe tersebut. Apabila perilaku yang diinginkan membutuhkan penyimpanan nilai di dalam objek, deklarasikan propertinya di dalam kelas, karena properti extension tidak menyediakan tempat penyimpanan apa pun.
Fungsi infix dan syaratnya#
Fungsi infix dipanggil tanpa titik dan tanpa tanda kurung, sehingga 2 pangkat 10 terbaca seperti ekspresi bahasa biasa. Syaratnya ada tiga. Pertama, fungsi harus berupa anggota kelas atau extension. Kedua, fungsi memiliki tepat satu parameter wajib. Ketiga, parameter itu tidak boleh memiliki nilai bawaan dan tidak boleh ditandai vararg. Deklarasinya tetap seperti fungsi pada umumnya, cukup diawali kata kunci infix.
infix fun Int.pangkat(n: Int): Int {
var hasil = 1
repeat(n) { hasil *= this }
return hasil
}
infix fun String.ulang(n: Int): String = repeat(n)
fun main() {
println(2 pangkat 10)
println(3 pangkat 4)
println("-" ulang 8)
println(2 pangkat 3 + 1)
println(1 to "satu")
}# kompilasi berkas infix.kt menjadi infix.jar, lalu jalankan programnya
kotlinc infix.kt -d infix.jar && java -cp "infix.jar:$STDLIB" InfixKt1024
81
--------
16
(1, satu)Fungsi pangkat menghasilkan 1024 untuk 2 pangkat 10 dan 81 untuk 3 pangkat 4, sedangkan ulang menghasilkan delapan tanda hubung dari "-" ulang 8. Pustaka standar juga memanfaatkan notasi ini secara luas. Fungsi to adalah infix milik pustaka standar yang membentuk Pair, sehingga 1 to "satu" menghasilkan (1, satu) pada baris terakhir keluaran. Notasi serupa juga dipakai pada downTo, step, dan until saat membentuk range.
Fungsi infix yang berupa extension tetap mengikuti aturan impor extension pada umumnya. Deklarasinya harus terlihat pada titik pemanggilan, baik karena berada dalam package yang sama maupun karena diimpor secara eksplisit. Sifat yang sama berlaku pada fungsi infix anggota kelas, yang pemanggilannya mengikuti visibilitas anggota tersebut.
Kedudukan infix terhadap operator lain#
Kedudukan (precedence) infix lebih rendah daripada operator aritmetika. Pemanggilan 2 pangkat 3 + 1 dengan demikian dibaca compiler sebagai 2 pangkat (3 + 1), bukan (2 pangkat 3) + 1, sehingga hasilnya 16 dan bukan 9. Baris keempat keluaran di atas memperlihatkan urutan pengerjaan itu secara nyata. Bila urutan yang dimaksudkan berbeda dari aturan ini, tuliskan tanda kurung secara eksplisit agar maksudnya terbaca dari kodenya.
Kedudukan ini berlaku pula terhadap operator range, yang mengikat lebih kuat daripada infix, dan terhadap operator elvis, yang mengikat lebih lemah. Apabila pemanggilan infix berdampingan dengan operator-operator tersebut, tuliskan tanda kurung agar urutan pengerjaannya tidak menimbulkan tafsir ganda.
Notasi infix paling menguntungkan pada pemanggilan yang memang membentuk kalimat, misalnya pembentukan pasangan, rentang, atau pemanggilan bertingkat pada DSL. Untuk fungsi yang argumennya kompleks, bentuk pemanggilan biasa dengan titik dan tanda kurung lebih jelas, karena tanda kurung itu menampung ekspresi tanpa menimbulkan keraguan urutan pengerjaan.
Ringkasan#
- Properti extension dideklarasikan di luar kelas tanpa backing field dan wajib menyediakan getter yang menghitung hasilnya pada setiap akses.
- Fungsi
infixdipanggil tanpa titik dan tanda kurung, dengan syarat berupa anggota atau extension, satu parameter wajib, tanpa nilai bawaan, dan tanpavararg. - Kedudukan infix lebih rendah daripada operator aritmetika, sehingga
2 pangkat 3 + 1dievaluasi sebagai2 pangkat (3 + 1). - Fungsi
topada pustaka standar adalah infix yang membentukPairdan menjadi contoh notasi ini di banyak tempat.
Referensi#
- Extensions — Kotlin Documentation — Deklarasi properti extension beserta batasan getter dan setternya.
- Functions — Kotlin Documentation — Notasi infix beserta syarat fungsi yang boleh memakainya.