Kotlin: Mengenal Fungsi dan Properti Ekstensi
Ekstensi merupakan salah satu fitur Kotlin. Ekstensi memungkinkan kita menambahkan properti atau fungsi ke kelas tanpa mengubah deklarasinya kelas.
Saya sarankan kalian mengetahui Fungsi dan Kelas yang ada di bahasa Kotlin, jika belum kalian bisa membaca penjelasannya di link berikut:
Fungsi Ekstensi (Extension function)
Dengan fungsi ekstensi kita dapat menambahkan fungsi ke sebuah Kelas tanpa mengubah deklarasi kelas tersebut.
Contoh pertama.
Kita ingin menambahkan fungsi ekstensi bernama sayHello
ke kelas String
. Kita bisa menuliskannya
dengan seperti ini:
fun String.sayHello() {
println("Hello my name is $this")
println("My name has $length character")
}
this
berisi objek yang memanggil fungsi sayHello
(sama seperti this
pada fungsi anggota
kelas). Fungsi sayHello
dapat mengakses semua properti dari String
, contohnya length
. Untuk
memanggilnya:
val nama = "Levi"
nama.sayHello()
// Output:
// Hello my name is Levi
// My name has 4 character
Contoh kedua.
Kita ingin menambahkan fungsi ekstensi bernama isOdd
ke kelas Int
untuk mengecek apakah suatu
angka bernilai ganjil dan isEven
ke kelas Int
untuk mengecek apakah suatu angka bernilai genap.
Kodenya seperti ini:
fun Int.isOdd() = this % 2 == 1
fun Int.isEven() = this % 2 == 0
Kita bisa memanggilnya seperti ini:
val number = 1
println("Number is odd ${number.isOdd()}")
println("Number is even ${number.isEven()}")
println("4 is odd ${4.isOdd()}")
println("4 is even ${4.isEven()}")
println("9 is odd ${9.isOdd()}")
println("9 is even ${9.isEven()}")
// Output:
// Number is odd true
// Number is even false
// 4 is odd false
// 4 is even true
// 9 is odd true
// 9 is even false
Properti Ekstensi (Extension property)
Properti Ekstensi (Extension property) memungkinkan kita menambahkan property kepada suatu Kelas tanpa mengubah deklarasi Kelas. Properti ekstensi hanya bisa dideklarasikan dengan setter dan getter. Mendeklarasikan properti ekstensi dengan cara seperti ini tidak bisa dilakukan:
val Int.someNumber = 1
// error: extension property cannot be initialized because it has no backing field
Contoh pertama.
Kita menambahkan properti ekstensi ke String
bernama middleChar
yang berisi karakter yang berada
di tengah.
val String.middleChar: Char
get() = this[length / 2]
Properti di atas bisa diakses seperti ini:
val str = "Gigin"
println(str.middleChar)
println("Abu".middleChar)
// Output:
// g
// b
Contoh kedua.
Kita mengubah fungsi ekstensi isOdd
dan isEven
menjadi properti ekstensi seperti beriku:
val Int.isOdd: Boolean
get() = this % 2 == 1
val Int.isEven: Boolean
get() = this % 2 == 0
Properti dapat diakses seperti ini:
val number = 1
println("Number is odd ${number.isOdd}")
println("Number is even ${number.isEven}")
println("4 is odd ${4.isOdd}")
println("4 is even ${4.isEven}")
println("9 is odd ${9.isOdd}")
println("9 is even ${9.isEven}")
// Output:
// Number is odd true
// Number is even false
// 4 is odd false
// 4 is even true
// 9 is odd true
// 9 is even false
Ekstensi untuk Companion Object
Companion Object juga bisa memiliki ekstensi. Contohnya seperti ini:
fun String.Companion.fromName(name: String) = "Name: $name"
Fungsi di atas bisa diakses seperti berikut:
println(String.fromName("Lifai")) // Name: Lifai
Kapan kita membutuhkan Ekstensi
Ekstensi sangat berguna saat kita menginginkan untuk menambahkan fitur ke suatu Kelas, tapi kita tidak bisa dan tidak ingin mengubah deklarasi kelas tersebut, terutama kelas bawaan Kotlin dan kelas dari pustaka pihak ketiga.
Fitur Ekstensi pada Kotlin sering digunakan oleh pustaka Android-KTX dan Android JetPack.