Extension Function
Extension Function adalah fitur Kotlin yang memungkinkan kita menambahkan function baru ke sebuah class atau tipe data tanpa harus mengubah atau membuat turunan dari class tersebut.
Dengan Extension Function, kita dapat menambahkan function pada class yang sudah tersedia, termasuk class bawaan Kotlin seperti:
StringIntDoubleList- dan berbagai class lainnya.
Sintaks Extension Function
Bentuk umum Extension Function:
fun TipeData.namaFunction(): TipeReturn {
// kode
}
Contoh:
fun String.hello(): String {
return "Hello $this"
}
Pada contoh tersebut:
String
adalah receiver type.
Sedangkan:
hello()
adalah nama Extension Function.
Jadi function:
fun String.hello()
menambahkan function hello() pada tipe data String.
Menggunakan this pada Extension Function
Di dalam Extension Function, keyword this digunakan untuk mengakses object yang memanggil function tersebut.
Contoh:
fun String.hello(): String {
return "Hello $this"
}
Jika function dipanggil menggunakan:
val name = "Ucup"
name.hello()
Maka:
this
mengacu pada object:
Ucup
Sehingga hasilnya:
Hello Ucup
Contoh Extension Function Sederhana
fun String.hello(): String {
return "Hello $this"
}
fun main() {
val name: String = "Ucup"
val hello: String = name.hello()
println(hello)
}
Output:
Hello Ucup
Pada kode:
name.hello()
Kotlin menjalankan Extension Function hello() pada object name.
Karena name berisi:
Ucup
maka this di dalam function mengacu pada "Ucup".
Extension Function dengan Single Expression
Extension Function juga dapat dibuat menggunakan Single Expression Function.
Contoh:
fun String.printHello(): Unit = println("Hello bro $this")
Function tersebut merupakan Extension Function untuk String.
Kita dapat memanggilnya:
val name = "Ucup"
name.printHello()
Output:
Hello bro Ucup
Contoh Program Lengkap
Berikut contoh lengkap penggunaan Extension Function:
fun String.hello(): String {
return "Hello $this"
}
fun String.printHello(): Unit = println("Hello bro $this")
fun main() {
val name: String = "Ucup"
val hello: String = name.hello()
println(hello)
name.printHello()
}
Output:
Hello Ucup
Hello bro Ucup
Memahami Receiver Type
Bagian penting dalam Extension Function adalah receiver type.
Pada function:
fun String.hello(): String {
return "Hello $this"
}
String adalah receiver type.
Artinya function hello() dapat dipanggil oleh object yang bertipe String.
Contoh:
val name = "Ucup"
name.hello()
Karena name bertipe String, maka function hello() dapat digunakan.
Extension Function pada Int
Extension Function tidak hanya dapat digunakan pada String.
Kita juga dapat membuat Extension Function untuk Int.
Contoh:
fun Int.kaliLima(): Int {
return this * 5
}
Penggunaan:
val number = 10
val result = number.kaliLima()
println(result)
Output:
50
Di dalam function:
this * 5
this mengacu pada nilai number.
Sehingga:
10 * 5 = 50
Extension Function pada Double
Contoh:
fun Double.kaliDua(): Double {
return this * 2
}
Penggunaan:
val number = 10.5
println(number.kaliDua())
Output:
21.0
Extension Function untuk Memeriksa String
Kita juga dapat membuat function untuk melakukan validasi sederhana.
Contoh:
fun String.isPanjang(): Boolean {
return this.length >= 5
}
Penggunaan:
val name = "Ucup"
println(name.isPanjang())
Output:
false
Contoh lainnya:
val name = "Agustian"
println(name.isPanjang())
Output:
true
Extension Function Tidak Mengubah Class Asli
Extension Function tidak benar-benar menambahkan function ke dalam source code class asli.
Contoh:
fun String.hello(): String {
return "Hello $this"
}
Kita tidak mengubah class String.
Kita hanya memberikan kemampuan tambahan yang dapat digunakan dengan sintaks:
name.hello()
Hal ini membuat Extension Function sangat berguna untuk membuat kode menjadi lebih mudah dibaca.
Kelebihan Extension Function
Extension Function memiliki beberapa keuntungan:
- Membuat kode lebih mudah dibaca.
- Membuat function tambahan tanpa mengubah class asli.
- Dapat digunakan pada class yang sudah tersedia.
- Membuat kode lebih ekspresif.
- Mengurangi kebutuhan membuat utility function yang terpisah.
- Dapat digunakan pada berbagai tipe data.
Contoh:
fun String.hello() = "Hello $this"
Kemudian dapat digunakan dengan cara yang natural:
"Ucup".hello()
Contoh Program Lengkap
Berikut contoh beberapa Extension Function:
fun String.hello(): String {
return "Hello $this"
}
fun String.printHello(): Unit {
println("Hello bro $this")
}
fun Int.kaliLima(): Int {
return this * 5
}
fun Int.isGenap(): Boolean {
return this % 2 == 0
}
fun main() {
val name = "Ucup"
println(name.hello())
name.printHello()
val number = 10
println(number.kaliLima())
println(number.isGenap())
}
Output:
Hello Ucup
Hello bro Ucup
50
true
Kesimpulan
Extension Function memungkinkan kita membuat function tambahan untuk sebuah class atau tipe data tanpa mengubah class tersebut.
Sintaks dasarnya:
fun TipeData.namaFunction(): TipeReturn {
// kode
}
Contoh:
fun String.hello(): String {
return "Hello $this"
}
Kemudian dapat digunakan:
val name = "Ucup"
println(name.hello())
String pada:
fun String.hello()
disebut receiver type, sedangkan this mengacu pada object yang memanggil Extension Function.
Contoh lain:
fun String.printHello(): Unit = println("Hello bro $this")
Kemudian:
name.printHello()
Dengan Extension Function, kita dapat membuat function tambahan yang penggunaannya terlihat seperti bagian dari class atau tipe data tersebut.