Sebagian besar pustaka Java dan basis kode lama menyediakan API berupa collection java.util serta kelas bergaya JavaBean dengan getter dan setter. Kotlin memakai API warisan (legacy) semacam ini secara langsung, tanpa lapisan konversi di sisi Java. Topik ini menunjukkan pemakaian ArrayList dan HashMap dari Kotlin, pemetaan getter dan setter menjadi properti, serta cara berpindah dari collection Java ke collection Kotlin pada titik yang tepat.
Collection Java dipakai langsung dari Kotlin#
Kelas java.util.ArrayList dan java.util.HashMap dapat dideklarasikan, diisi, dan dibaca dari kode Kotlin seperti collection Kotlin. Contoh berikut menyusun daftar nilai ujian, mengurutkannya dengan metode static Collections.sort, lalu membacanya.
// ArrayList Java dipakai langsung dari Kotlin
import java.util.ArrayList
import java.util.Collections
fun main() {
val nilai = ArrayList<Int>()
nilai.add(80)
nilai.add(75)
nilai.add(90)
Collections.sort(nilai)
println(nilai)
println(nilai[0])
println(nilai.size)
var total = 0
for (n in nilai) {
total += n
}
println(total)
}export JAVA_HOME=/home/kal/my-project/tools/jdk-merged
export PATH=$JAVA_HOME/bin:/home/kal/my-project/tools/kotlinc/bin:$PATH
export STDLIB=/home/kal/my-project/tools/kotlinc/lib/kotlin-stdlib.jar
kotlinc daftar.kt -d daftar.jar
java -cp "daftar.jar:$STDLIB" DaftarKt[75, 80, 90]
75
3
245Setiap baris keluaran berasal dari cara akses yang berbeda. Pemanggilan nilai[0] diterjemahkan compiler menjadi get(0), sedangkan nilai.size menjadi size(), karena pasangan get(int) dan size() dikenali sebagai akses indeks dan properti. Perulangan for menerima ArrayList apa adanya karena kelas tersebut mengimplementasikan java.lang.Iterable, dan static import Collections.sort berperilaku seperti pemanggilan fungsi biasa. Perlu dicatat bahwa Kotlin memperlakukan java.util.List sebagai tipe fleksibel yang dapat dipandang sebagai List maupun MutableList, sehingga pembacaan dan pengubahan isinya sama-sama sah tanpa konversi.
Pasangan getter dan setter sebagai properti#
Kelas Java gaya lama biasanya menyembunyikan fieldnya di belakang pasangan getXxx dan setXxx. Compiler Kotlin mengenali pola ini dan menghadirkan properti sintetis yang namanya diambil dari akhiran metodenya, sehingga kode Kotlin dapat membaca dan mengisi nilainya seperti properti biasa.
// tidak-dijalankan
// Kelas Java gaya lama dengan getter dan setter
public class NilaiSiswa {
private String nama;
private int nilai;
public String getNama() {
return nama;
}
public void setNama(String nama) {
this.nama = nama;
}
public int getNilai() {
return nilai;
}
public void setNilai(int nilai) {
this.nilai = nilai;
}
}// Getter dan setter Java diakses sebagai properti Kotlin
fun main() {
val siswa = NilaiSiswa()
siswa.nama = "Budi"
siswa.nilai = 88
println("${siswa.nama}: ${siswa.nilai}")
println(siswa.getNilai())
}export JAVA_HOME=/home/kal/my-project/tools/jdk-merged
export PATH=$JAVA_HOME/bin:/home/kal/my-project/tools/kotlinc/bin:$PATH
export STDLIB=/home/kal/my-project/tools/kotlinc/lib/kotlin-stdlib.jar
# kelas Java dikompilasi lebih dulu agar terlihat oleh kotlinc
javac NilaiSiswa.java
kotlinc siswa.kt -cp . -d siswa.jar
java -cp "siswa.jar:$STDLIB:." SiswaKtBudi: 88
88Penugasan siswa.nama = "Budi" memanggil setNama, sedangkan siswa.nama memanggil getNama, dan baris siswa.getNilai() membuktikan bahwa bentuk pemanggilan metode tetap sah bila lebih disukai. Syarat pemetaannya konsisten dengan konvensi JavaBean, yaitu getter tanpa parameter dan setter dengan satu parameter yang tipenya sama. Getter boolean yang diawali is, misalnya isAktif(), juga dipetakan sebagai properti dengan nama yang sama tanpa perubahan awalan.
Iterator dan konversi ke collection Kotlin#
Collection Java dapat dijelajahi dengan iterator maupun perulangan for, karena keduanya berbagi mekanisme yang sama, yaitu metode iterator() yang menghasilkan objek dengan hasNext() dan next(). Setelah eksplorasi selesai, isi collection Java dapat dipindahkan ke collection Kotlin melalui toList, toMutableList, atau toMap agar fungsi-fungsi khas Kotlin dapat dipakai sepenuhnya.
// HashMap Java dan konversi ke collection Kotlin
import java.util.HashMap
fun main() {
val peta = HashMap<String, Int>()
peta["matematika"] = 85
peta["bahasa"] = 78
peta["ilmu alam"] = 92
println(peta.values.average())
val petaKotlin: Map<String, Int> = peta.toMap()
println(petaKotlin["ilmu alam"])
println(peta.toList().sumOf { it.second })
}export JAVA_HOME=/home/kal/my-project/tools/jdk-merged
export PATH=$JAVA_HOME/bin:/home/kal/my-project/tools/kotlinc/bin:$PATH
export STDLIB=/home/kal/my-project/tools/kotlinc/lib/kotlin-stdlib.jar
kotlinc peta.kt -d peta.jar
java -cp "peta.jar:$STDLIB" PetaKt85.0
92
255Baris pertama keluaran memanggil average() atas peta.values, yaitu rata-rata 85, 78, dan 92. Hasil toMap() disimpan pada variabel bertipe Map<String, Int> yang berasal dari pustaka standar Kotlin, sehingga pengaksesan petaKotlin["ilmu alam"] menghasilkan Int? dan siap diberi penanganan null. Baris terakhir memanggil toList() yang mengubah HashMap menjadi daftar pasangan, kemudian sumOf menjumlahkan nilai kedua dari setiap pasangan menjadi 255.
Ringkasan#
ArrayListdanHashMapdarijava.utildipakai dari Kotlin apa adanya, termasuk akses indeks, propertisize, static import, dan perulanganfor.- Pasangan getter dan setter yang mengikuti konvensi JavaBean dipetakan compiler menjadi properti sintetis, sedangkan pemanggilan metode aslinya tetap sah.
- Collection Java dapat dijelajahi lewat
iterator(),hasNext(), dannext(), yang juga menjadi dasar perulanganfor. - Fungsi
toList,toMutableList, dantoMapmemindahkan isi collection Java ke collection Kotlin agar operator dan penanganan null milik Kotlin dapat digunakan.
Referensi#
- Calling Java from Kotlin: getters and setters — JetBrains — Aturan pemetaan getter dan setter Java menjadi properti sintetis di Kotlin.
- Collections overview — JetBrains — Gambaran collection Kotlin yang menjadi tujuan konversi dari collection Java.