Kotlin memungkinkan kita untuk menambahkan sebuah fungsi baru pada sebuah kelas tanpa harus mewarisi kelas tersebut. Misal kita ingin menambahkan fungsi baru untuk kelas Int, maka kita akan menuliskannya seperti berikut:
- class NewInt : Int(){
- fun printInt(){
- println("value $this")
- }
- }
Ketika dijalankan, kode di atas akan gagal dikompilasi, kenapa? Karena kelas Int bersifat final, sehingga tidak memungkinkan untuk mewarisi kelas tersebut. Untuk itu, kita bisa melakukannya dengan deklarasi khusus yang disebut dengan Extensions.
Kotlin mendukung 2 (dua) extension yang dapat digunakan, yaitu Extension Functions dan Extension Properties. Jika extension functions digunakan untuk menambahkan fungsi baru, extension properties tentunya digunakan untuk menambahkan sebuah properti baru.
Extension Functions
Untuk mendeklarasikan sebuah extension functions, kita perlu menentukan terlebih dahulu receiver type, kemudian nama dari fungsi tersebut yang mana keduanya dipisahkan oleh titik (.). Contohnya, seperti berikut:
- fun Int.printInt() {
- print("value $this")
- }
Bisa kita perhatikan, kelas Int pada kode di atas digunakan sebagai receiver type, sedangkan kata kunci this adalah receiver type yang bertindak sebagai objeknya. Nilai dari objek tersebut bisa digunakan di dalam extension yang sudah dibuat.
Untuk memanggil extension functions di atas, lakukan dengan cara seperti berikut:
- fun main() {
- 10.printInt()
- }
- fun Int.printInt() {
- print("value $this")
- }
- /*
- output : value 10
- */
Kita juga bisa menetapkan jika extension functions tersebut dapat mengembalikan nilai, deklarasinya pun sama halnya seperti fungsi pada umumnya. Contohnya seperti berikut:
- fun main() {
- println(10.plusThree())
- }
- fun Int.plusThree(): Int {
- return this + 3
- }
- /*
- output : 13
- */
Extension Properties
Selanjutnya adalah extension properties. Seperti yang disebutkan di awal, Kotlin juga mendukung extension untuk menambah sebuah properti baru pada sebuah kelas tanpa harus menyentuh kode di dalam kelas tersebut.
Deklarasinya pun sama seperti extension functions. Kita terlebih dahulu menentukan receiver type kemudian nama dari properti tersebut. Contoh seperti berikut:
- val Int.slice: Int
- get() = this / 2
Untuk memanggil extension di atas, lakukan dengan cara berikut:
- fun main() {
- println(10.slice)
- }
- val Int.slice: Int
- get() = this / 2
- /*
- output : 5
- */
Yang perlu diketahui, extension tidak benar-benar mengubah sebuah kelas dengan menambahkan sebuah fungsi atau properti baru. Ini karena extension memiliki hubungan langsung dengan kelas yang ingin diperluas fungsionalitasnya. Sehingga extension properties hanya bisa dideklarasikan dengan cara menyediakan getter atau setter secara eksplisit
Posting Komentar