Generics, Kotlin Delegation & Destructuring Declarations
Generics merupakan fitur yang ada di dalam kotlin yang memungkinkan kita untuk membuat class atau fungsi yang dapat digeneralisasi agar dapat bekerja dengan berbagai jenis data tanpa harus menentukan tipe data secara spesifik. Dengan adanya generics ini akan memudahkan dalam pembuatan kode yang fleksibel dan juga lebih umum karena tidak perlu untuk menuliskan kode yang sama berulang untuk setiap tipe data yang berbeda karena pada saat pembuatan class atau method menggunakan parameter Type <parameter>. Parameter type generics yang biasa digunakan oleh developer Kotlin (tidak wajib atau bebas dalam penamaan parameter Type) adalah:
● E - Element
● K - Key
● N - Number
● T - Type
● V - Value
Keuntungan dari penggunaan class generics ini nantinya class ini bisa digunakan berulang - ulang dengan berbagai tipe data yang dibutuhkan. Contohnya seperti berikut.
Di classBox, kita memiliki parameter tipe generik <T>. Parameter ini digunakan untuk menentukan tipe data dari item yang disimpan dalam kotak. Dalam contoh ini, kita membuat objek stringBox dengan tipe generik String dan objek intBox dengan tipe generik Int serta doubleBox = Box(10.50). Kemudian, kita menggunakan fungsi getItem() untuk mendapatkan nilai yang disimpan dalam setiap kotak dengan tipe yang sesuai.
Selanjutnya, kita juga memiliki fungsi generik printItem() yang menggunakan parameter tipe generik <T>. Fungsi ini dapat menerima argumen dengan tipe apa pun dan mencetak nilai tersebut ke konsol.
Kotlin delegation merupakan sebuah fitur yang memungkinkan kelas untuk mendelegasikan implementasi fungsi atau properti kepada objek lain. Dengan delegasi, kita dapat menghindari penulisan kode yang berulang. keyword by digunakan pada saat akan mendeklarasikan sebuah delegation di dalam program kotlin. Jenis delegation yang paling sering digunakan oleh developer ada dua, yaitu property delegation dan class delegation.
1. Property Delegation
Bayangkan Anda adalah seorang pemilik apartemen yang ingin menyewakan unit apartemen kepada penyewa. Anda ingin memastikan bahwa penyewa membayar sewa tepat waktu dan tidak ada pembayaran yang tertunda. Namun, Anda tidak ingin repot mengingatkan setiap penyewa untuk membayar secara manual setiap bulan.
Dalam contoh di atas, ApartmentOwner adalah class utama yang memiliki tanggung jawab utama dalam mengelola properti apartemen. Namun, ia mendelegasikan tanggung jawab pembayaran sewa kepada RentPaymentManager dengan menggunakan property delegation.
Dengan menggunakan by paymentDelegate pada class ApartmentOwner, semua panggilan metode terkait pembayaran seperti checkPaymentDue(), remindPayment(), dan processPayment() pada object ApartmentOwner akan langsung didelegasikan ke object RentPaymentManager. Ini menggambarkan bagaimana property delegation memungkinkan tanggung jawab tertentu dalam mengelola properti dapat diambil alih oleh objek delegat yang sesuai.
2. Class Delegation
Dalam contoh di atas, Student merupakan class utama yang memiliki tanggung jawab utama dalam mengerjakan dan mengulas tugas-tugas. Namun, class Student mendelegasikan tanggung jawab pengumpulan tugas kepada AssignmentAssistant dengan menggunakan class delegation.
Dengan menggunakan by assistant pada class Student, semua panggilan metode submitAssignment() pada object Student akan langsung didelegasikan ke object AssignmentAssistant. Ini menggambarkan bagaimana class delegation memungkinkan tanggung jawab tertentu dalam mengelola pengumpulan tugas dapat diambil alih oleh objek delegat yang sesuai.
Destructuring declaration merupakan fitur di dalam Kotlin yang memungkinkan kita untuk memecah struktur data yang kompleks, seperti array, list, atau objek, menjadi beberapa variabel terpisah. Fitur ini memudahkan kita dalam mengakses dan menggunakan nilai-nilai yang terkandung dalam struktur data tersebut.
Dalam Kotlin, destructuring declaration dapat dilakukan dengan menggunakan pola atau pattern yang sesuai dengan struktur data yang ingin kita pecahkan. Pada dasarnya, pola ini menggambarkan urutan atau nama variabel yang akan digunakan untuk menyimpan nilai-nilai yang diekstrak. Contoh implementasi dari destructuring declarations seperti berikut:
1. Destructuring declaration pada Array:
2. Destructuring declaration pada List:
3. Destructuring declaration pada Object: