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.