Extension ve Infix Fonksiyonlar
Selam arkadaşlar, bugünkü konumuz öğrendikten sonra severek ve çok kullandığımız extension ve infix fonksiyonlar.
Extension Fonksiyonlar
“Üzerinde değişiklik yapamadığımız (read-only) class’lara veya yapmak istemediğimiz class’lara, bu class’ların içerisinde yazmadan fonksiyon tanımlayabilmemizi sağlar.”
NOT: Extension yazacağımız class’ı ifade ederken “receiver” olarak adlandırırız.
Bir class içerisinde extension fonksiyonu yazıldığı zaman sadece o class içerisinden ulaşılabilir.
Bir class’a extension yazıldığında, o class’ın private olmayan değişkenlerine ulaşabiliriz.
“numberTwo” silip çalıştırdığımızda çıkan sonuç;
En fazla kullandığımız extension fonksiyonlara bir kaç tane örnek verelim.
fun View.visible() {
visibility = View.VISIBLE
}
fun View.gone() {
visibility = View.GONE
}
fun ImageView.loadImage(url: String?) {
Glide.with(this)
.load(url)
.fitCenter()
.into(this)
}
fun Int?.orZero() = this ?: 0
fun Double?.orZero() = this ?: 0.0
fun View.showSnackBar(message: String, view: View = this, duration: Int = Toast.LENGTH_SHORT) {
Snackbar.make(view, message, duration).show()
}
fun Context.showToast(message: String, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, message, duration).show()
}
fun <T> Fragment.collectFlow(
flow: Flow<T>,
state: Lifecycle.State = Lifecycle.State.STARTED,
action: suspend (T) -> Unit
) {
viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(state) {
flow.collect {
action(it)
}
}
}
}
Infix Fonksiyonlar
Infix fonksiyonlarını, daha okunaklı bir kod yazmak için tercih ederiz. Nokta kullanımını kaldırır. Infix bir fonksiyon yazmak için yerine getirmemiz gereken bazı koşullar vardır.
- Infix keyword’ü ile başlamalıdır.
- Bir class’ın üyesi olması gerekir (member method) ya da extension metod olması gerekir.
- Sadece bir parametre almak zorundadır ve bu parametre vararg olamaz.
- Boş parametre verilemez.
- Infix fonksiyonlar default değer alamaz.
Infix fonksiyonları, extension şeklinde de kullanılabilir; ancak infixlerin okunabilirliği artırdığı için normal bir extension fonksiyonu gibi kullanmamamız gerekir.
Kotlin tarafından hazır gelen bazı infix fonksiyonlara bakalım.
for (i in 1 downTo 100 step 2) {
when (i) {
1 and 2 -> {}
3 or 4 -> {}
else -> {}
}
}
Kotlin tarafından gelen bazı infix fonksiyonlar “downTo” , “step” , “and” , “or”
Performans
Şimdi ise aynı işlemi yapan infix ve extension fonksiyon yazalım ve aralarında performans farkı var mı, onu kontrol edelim.
infix fun Int.add(number: Int): Int {
return this + number
}
fun Int.add2(number: Int): Int {
return this + number
}
fun main() {
for (i in 1..10) {
infix()
}
}
fun infix() {
val startTime = System.nanoTime()
var total = 0
for (value in 1..1_000_000_000) {
total += value add value
}
val endTime = System.nanoTime()
val duration = endTime - startTime
println("duration infix--> $duration")
}
fun extension() {
val startTime = System.nanoTime()
var total = 0
for (value in 1..1_000_000_000) {
total += value.add2(value)
}
val endTime = System.nanoTime()
val duration = endTime - startTime
println("duration extension--> $duration")
}
infix fonksiyon’un değerleri
extension fonksiyon’un değerleri
görüldüğü üzere iki kullanım arasında performans açısından bir fark yok.
veeeeeeeeeeeeeeeeeeeeeeeeeeee SON