Extension ve Infix Fonksiyonlar

UMUTCAN SAHIN
4 min readJun 17, 2023

--

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.

  1. Infix keyword’ü ile başlamalıdır.
  2. Bir class’ın üyesi olması gerekir (member method) ya da extension metod olması gerekir.
  3. Sadece bir parametre almak zorundadır ve bu parametre vararg olamaz.
  4. Boş parametre verilemez.
  5. 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

--

--