API Java Warisan

Bekerja dengan collections dan getter/setter Java lama.

Daftar isi

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.

kotlin daftar.kt
// 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)
}
bash
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
text Keluaran
[75, 80, 90]
75
3
245

Setiap 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.

java NilaiSiswa.java
// 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;
    }
}
kotlin siswa.kt
// 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())
}
bash
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:." SiswaKt
text Keluaran
Budi: 88
88

Penugasan 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.

kotlin peta.kt
// 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 })
}
bash
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" PetaKt
text Keluaran
85.0
92
255

Baris 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#

  • ArrayList dan HashMap dari java.util dipakai dari Kotlin apa adanya, termasuk akses indeks, properti size, static import, dan perulangan for.
  • 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(), dan next(), yang juga menjadi dasar perulangan for.
  • Fungsi toList, toMutableList, dan toMap memindahkan isi collection Java ke collection Kotlin agar operator dan penanganan null milik Kotlin dapat digunakan.

Referensi#