Kotlin Cover - Inpows
Kotlin

Eksplorasi Kotlin Annotations

Eksplorasi Kotlin Annotations – Pada artikel ini membahas mengenai eksplorasi kotlin annotations yang digunakan saat mengembangkan aplikasi Android. Di sini kita akan menjelajahi anotasi @JvmStatic, @JvmOverloads, dan @JvmField. Kenapa saya menggunakan kotlin sebagai bahasa pemrograman yang digunakan untuk mengembangkan aplikasi Android karena Google menyarankan Kotlin sebagai bahasa resmi untuk pengembangan Android, sebagian besar orang sedang dalam proses memigrasi kode Java yang ada ke kode Kotlin. Akan tetapi, dalam migrasi kode yang dilakukan biasanya tidak dapat mengonversi semua kode sumber dari Java ke Kotlin dalam satu sprint itu sendiri. Jadi, migrasi kode yang dilakukan hanya mengubah beberapa bagian kode (Kelas, enum, dll) menjadi Kotlin dan menggabungkannya dengan kode java yang ada. Jika Anda sedang dalam proses ini atau akan melakukan proses ini, ada beberapa anotasi yang harus Anda ketahui. Simak artikel berikut ini untuk ekplorasi kotlin annotations sehingga Anda semakin memahami mengenai anotasi.

Eksplorasi Kotlin Annotations

Anotasi @JvmStatic

Di Kotlin, fungsi pada package-level direpresentasikan sebagai metode statis. Selain itu, di Kotlin juga bisa membuat metode statis untuk fungsi yang ditentukan di beberapa objek pendamping atau objek bernama dengan menggunakan anotasi @JvmStatic.

@Target([AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER])
annotation class JvmStatic

Ini menjadikan kalau metode statis tambahan perlu dibuat dari elemen ini dan jika itu adalah sebuah fungsi. Jika elemen ini adalah properti, static getter/setter tambahan harus dibuat. Perhatikan class dibawah ini:

class ClassName {
    companion object {
        @JvmStatic
        fun sayaStatis() {
            // body dari fungsi statis
        }
        fun sayaTidakStatis() {
            // body dari fungsi tidak statis
        }
    }
}

Pada class diatas, sayaStatis() adalah fungsi statis dan sayaTidakStatis() adalah fungsi non-statis. Misalkan Anda memanggil metode di atas dari kelas Java. Ini akan berperilaku seperti di bawah ini:

ClassName.sayaStatis(); // Dapat berjalan dengan baik
ClassName.sayaTidakStatis(); // Error ketika compile 
ClassName.Companion.sayaStatisMethod(); // Dapat berjalan dengan baik
ClassName.Companion.sayaTidakStatisMethod(); // Dapat berjalan dengan baik

Selain itu, ada juga kasus objek yang bernama, prosedur yang sama berlaku adalah sebagai berikut:

object ObjectName {
    @JvmStatic fun sayaStatis() {
        // Body dari fungsi statis
    }
    fun sayaTidakStatis() {
        // Body dari fungsi tidak statis
    }
}

Panggil method di atas dari Java menggunakan cara seperti di bawah ini:

ObjectName.sayaStatis(); // Berjalan dengan baik
ObjectName.sayaTidakStatis(); // Error ketika compile
ObjectName.INSTANCE.sayaStatis(); // Berjalan dengan baik
ObjectName.INSTANCE.sayaTidakStatis(); // Berjalan dengan baik

Anotasi @JvmOverloads

@Target([AnnotationTarget.FUNCTION, AnnotationTarget.CONSTRUCTOR]) annotation class JvmOverloads

Anotasi ini menginstruksikan compiler Kotlin untuk menghasilkan overloads untuk fungsi ini yang menggantikan nilai parameter default. Jika suatu metode memiliki parameter N dan M yang memiliki nilai default, kelebihan M dihasilkan: yang pertama menggunakan parameter N-1 (semua kecuali yang terakhir yang mengambil nilai default), yang kedua mengambil parameter N-2, dan seterusnya.

Perhatikan kelas berikut ini, jika kelas memiliki dua field, dimana yang satu diinisialisasi dan yang lainnya tidak diinisialisasi.

data class Customer( val name: String, val dob: Date = Date())

Pada kelas ini secara default, tanggal saat ini akan diambil sebagai tanggal lahir customer. jika kita tidak meneruskan argumen kedua saat membuat objek customer. Jadi, jika kita memanggil dari Kotlin, kode berikut akan berjalan tanpa adanya kesalahan kompilasi.

val custSatu = Customer("Satu")
val custDua = Customer("Dua", Date())

Jika kita memanggil yang sama dari Java maka Anda harus meneruskan semua parameter jika tidak, Anda akan mendapatkan error kompilasi:

Customer custSatu = new Customer("Satu"); // Disini kita hanya melempar satu argumen, sehinnga akan mendapatkan error compile
Customer custDua = new Customer("Dua", new Date()); // Saat menjalankan ini akan aman

Untuk menggunakan nilai default saat membuat objek dari Java, kita dapat menggunakan anotasi @JvmOverloads. Setelah menggunakan anotasi, kode Kotlin akan menjadi seperti dibawah ini:

Customer @JvmOverloads constructor( val name: String, val dob: Date = Date())

Nah, sekarang memanggil dari Java, Anda tidak perlu meneruskan semua parameter:

Customer custSatu = new Customer("Satu"); // Tidak terjadi error
Customer custDua = new Customer("Dua", new Date()); // Tidak terjadi error

Anotasi @JvmField

@Target([AnnotationTarget.FIELD]) annotation class JvmField

Anotasi iIni menginstruksikan compiler Kotlin untuk tidak membuat getter/setter untuk properti ini dan mengeksposnya sebagai sebuah field.

Perhatikan kelas Java di bawah ini:

public class Customer {
    public String name;
    public Date dob;
    
    public getName() {
        return this.name;
    }
    public getDob() {
        return this.dob;
    }
}

Kode Kotlin yang sesuai dari kode Java diatas adalah seperti di bawah ini:

data class Customer( val name: String, val dob: Date = Date())

Jika Anda ingin mengakses properti kelas, maka kode di Kotlin adalah sebagai berikut ini:

val customer = Customer("Satu", Date())
val name = customer.name
val dob = customer.dob

Tapi di Java, kita harus menggunakan metode getter seperti di bawah ini:

Customer customer = new Customer("Satu", new Date());
String name = customer.getName();
Date dob = customer.getDob();

Jika Anda ingin field tertentu digunakan sebagai field yang normal dan bukan sebagai getter atau setter, maka Anda perlu memberi tahu kompiler untuk tidak membuat getter dan setter untuk hal yang sama dan ini bisa dicapai menggunakan anotasi @JvmField. Jadi, kode Kotlin setelah menggunakan anotasi @JvmField menjadi dibawah ini:

data class Customer(@JvmField val name: String, val dob: Date = Date())

 Nah, sekarang Anda dapat mengakses field dari Java seperti di bawah ini:

Customer customer = new Customer("Satu", new Date());
String name = customer.name;

Sekian artikel mengenai ekplorasi kotlin annotations.

Referensi menggunakan artikel:

  • https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html
  • https://proandroiddev.com/explore-kotlin-annotations-d52eddd7e7b6

Temukan source code menarik lainnya hanya di Inpows.