Member References di Kotlin
Seperti yang sudah kita pelajari pada modul sebelumnya, saat mendeklarasikan sebuah lambda dengan function type, kita bisa menggunakannya seperti berikut:
- val sum: (Int, Int) -> Int = { valueA, valueB -> valueA + valueB }
Dengan Kotlin, kita bisa memisahkan lambda expression menjadi fungsi tersendiri dan mereferensikannya langsung sebagai instance dari function type dengan cara seperti di bawah ini:
- val sum: (Int, Int) -> Int = ::count
- fun count(valueA: Int, valueB
- : Int): Int {
- return valueA + valueB
- }
Kode di atas ditulis dengan mekanisme Reflection yang berarti seperangkat fitur bahasa dan library yang memungkinkan kita untuk mengamati struktur kode dari proyek yang sedang kita kerjakan secara langsung.
Function References
Pada suatu kondisi, terkadang kita butuh mereferensikan sebuah fungsi. Sebagai contoh, misal kita memiliki fungsi seperti berikut:
- fun isEvenNumber(number: Int) = number % 2 == 0
Fungsi di atas digunakan untuk memeriksa apakah suatu angka merupakan sebuah bilangan genap. Dengan menggunakan operator :: kita bisa menggunakannya sebagai instances dari function type. Sebagai contoh, penggunaan fungsi filter() yang menjadi bagian dari kelas List berikut:
- fun main() {
- val numbers = 1.rangeTo(10)
- val evenNumbers = numbers.filter(::isEvenNumber)
- println(evenNumbers)
- }
- fun isEvenNumber(number: Int) = number % 2 == 0
- /*
- output = [2, 4, 6, 8, 10]
- */
Selain itu, kita juga bisa mereferensikan sebuah extensions function. Caranya dengan ikut menyertakan objek yang menjadi receivernya sebelum operator :: seperti berikut:
- fun main() {
- val numbers = 1.rangeTo(10)
- val evenNumbers = numbers.filter(Int::isEvenNumber)
- println(evenNumbers)
- }
- fun Int.isEvenNumber() = this % 2 == 0
- /*
- output = [2, 4, 6, 8, 10]
- */
Property References
Selain digunakan untuk mereferensikan sebuah fungsi. Operator :: juga dapat digunakan untuk mereferensikan sebuah properti. Dengan Operator, kita bisa mengakses apa yang menjadi bagian dari properti tersebut seperti nama, fungsi setter getter, dll. Contohnya seperti berikut:
- var message = "Kotlin"
- fun main() {
- println(::message.name)
- println(::message.get())
- ::message.set("Kotlin Academy")
- println(::message.get())
- }
Ekspresi ::message akan dievaluasi ke dalam objek dengan KMutableProperty yang memungkinkan kita untuk membaca nilainya dengan menggunakan get(), menetapkan nilai menggunakan set() dan mendapatkan nama dari properti tersebut menggunakan properti name.
Sedangkan untuk properti yang bersifat immutable seperti val message = “Kotlin”, ::message akan mengembalikan nilai dengan tipe KProperty, yang mana hanya terdapat fungsi get() di dalamnya.
- val message = "Kotlin"
- fun main() {
- println(::message.name)
- println(::message.get())
- // ::message.set("Kotlin Academy") <- Error : Unresolved reference.
- println(::message.get())
- }
Posting Komentar