Interoperabilitas Kotlin Java

1. Ikhtisar

Dalam tutorial ini, kita akan membahas interoperabilitas antara Java dan Kotlin. Kami akan membahas beberapa contoh dasar serta beberapa skenario lain yang lebih kompleks.

2. Menyiapkan Kotlin

Membuat proyek Kotlin sangat sederhana menggunakan IntelliJ, Eclipse, dan bahkan baris perintah - namun untuk tutorial ini kita akan mengikuti langkah-langkah instalasi dari tutorial sebelumnya Pengenalan Kotlin karena sudah memiliki apa yang kita butuhkan untuk tujuan demo kita.

3. Dasar-dasar

Memanggil Java dari Kotlin sangat mudah dan lancar karena dibuat dengan ide interoperabilitas .

Mari buat kelas Pelanggan ini menggunakan inti Java:

public class Customer { private String firstName; private String lastName; private int age; // standard setters and getters }

4. Getters dan Setter

Sekarang mari bekerja dengan Java POJO sederhana dari Kotlin.

Getters dan setter yang mengikuti konvensi Java untuk jenis metode ini direpresentasikan sebagai atribut di Kotlin:

val customer = Customer() customer.firstName = "Frodo" customer.lastName = "Baggins" assertEquals(customer.firstName, "Frodo") assertEquals(customer.lastName, "Baggins")

Ini perlu dicatat bahwa yang baru kata kunci tidak diperlukan untuk instantiating sebuah objek.

Bahasa mencoba untuk menghindari kode boilerplate sebanyak mungkin sehingga kami tidak memanggil getter / setter secara eksplisit - kami dapat menggunakannya dengan menggunakan notasi bidang.

Kita perlu ingat bahwa jika kelas Java hanya memiliki metode penyetel, properti tidak akan bisa diakses karena bahasa tidak mendukung properti set-only.

Jika suatu metode mengembalikan void maka ketika dipanggil dari Kotlin itu akan mengembalikan Unit .

5. Keamanan Nihil

Kotlin terkenal dengan fitur keamanan null-nya, tetapi seperti yang kita ketahui, hal ini tidak terjadi pada Java, yang membuatnya tidak praktis untuk objek yang berasal darinya. Contoh yang sangat sederhana dapat dilihat jika kita memiliki array String :

val characterList = ArrayList() characterList.add("Bilbo") val character = list[0]

Kotlin tidak menampilkan error nullability apa pun pada waktu kompilasi ketika metode dipanggil pada variabel jenis platform - dan jenis ini tidak dapat ditulis secara eksplisit dalam bahasa. Jadi ketika sebuah nilai ditetapkan, kita dapat mengandalkan inferensi ini, atau kita dapat memilih jenis yang kita harapkan:

val a: String? = character val a: String = character

Keduanya diperbolehkan, tetapi dalam kasus tipe bukan-null, compiler akan segera menegaskan saat penugasan, yang akan mencegah variabel untuk menyimpan nilai null.

Pada akhirnya, kompilator melakukan yang terbaik untuk menghindari null, tetapi tetap tidak mungkin untuk menghilangkannya karena generik.

6. Array

Dalam Kotlin, array bersifat invariant - yang berarti tidak memungkinkan kita menetapkan Array ke Array untuk mencegah kegagalan waktu proses.

Jadi kami memiliki kelas contoh:

public class ArrayExample { public int sumValues(int[] nums) { int res = 0; for (int x:nums) { res += x; } return res; } }

Jika kita ingin meneruskan array primitif ke metode ini, kita harus menggunakan salah satu kelas khusus dari Kotlin:

val ex = ArrayExample() val numArray = intArrayOf(1, 2, 3) assertEquals(ex.sumValues(numArray), 6)

7. Varargs

Java memberi kita kemampuan untuk meneruskan sejumlah argumen ke suatu metode:

public int sumArgValues(int... sums) { // same as above }

Prosesnya sama, dengan sedikit perbedaan yang kita perlukan untuk menggunakan operator penyebaran * untuk melewatkan array:

assertEquals(ex.sumValues(*numArray), 6)

Saat ini, tidak ada kemungkinan untuk meneruskan null ke metode varargs.

8. Pengecualian

Di Kotlin semua pengecualian tidak dicentang , yang berarti kompilator tidak akan memaksa kita untuk menangkap pengecualian apa pun:

// In our Java code public void writeList() throws IOException { File file = new File("E://file.txt"); FileReader fr = new FileReader(file); fr.close(); } // In Kotlin fun makeReadFile() { val ax = ArrayExample() ax.writeList() }

9. Refleksi

Sederhananya, refleksi berfungsi pada kelas Kotlin dan Java:

val instance = Customer::class.java val constructors = instance.constructors assertEquals(constructors.size, 1) assertEquals(constructors[0].name, "com.baeldung.java.Customer")

Kita juga bisa mendapatkan metode pengambil dan penyetel, KProperty untuk bidang Java dan KFungsi untuk konstruktor.

10. Metode Objek

Saat objek diimpor ke Kotlin, semua referensi tipe java.lang.Object diubah menjadi kotlin.Any :

val instance = Customer::class val supertypes = instance.supertypes assertEquals(supertypes[0].toString(), "kotlin.Any")

11. Kesimpulan

Tutorial singkat ini memberi kita pemahaman yang lebih besar tentang Interoperabilitas Java Kotlin . Kami telah melihat beberapa contoh sederhana untuk menunjukkan bagaimana Kotlin secara umum menghasilkan kode yang lebih sedikit verbose secara keseluruhan.

Seperti biasa, penerapan semua contoh dan cuplikan ini dapat ditemukan di GitHub.