Kotlin: Extension & Infix Functions
Selamlar!
Kotlin’i baştan ele aldığım yazı dizimde bu sefer konuğumuz extension functions ve infix functions oluyor. Kod yazarken bize büyük kolaylık sağlayan bu iki fonksiyon çeşidine vakit kaybetmeden göz atalım.
Extension Functions
Üzerinde değişiklik yapamadığımız veya yapmak istemediğimiz classlara bir fonksiyon ile ek bir özellik kazandırmak istediğimiz zaman extension function kullanabiliriz.
Örnek olarak Int classını ele alalım.
Int classına herhangi bir ekleme yapmaya çalıştığımız zaman dosyanın read-only olduğuna dair uyarı görüyoruz. Peki ben Int classına bir ekleme yapmak istiyorum. Bunu nasıl yapabilirim?
Burada bize yardım etmek için extension functionlar devreye giriyor. Extension function oluştururken temel fonksiyon yapısını oluşturur gibi fonksiyonumuzu hazırlıyoruz. Bundan sonra sadece fonksiyon ismimizin başına reciever classımızı yazıp fonksiyon ismiyle arasına nokta koyuyoruz. Extension function hazırlamak bu kadar kolay!
fun Int.addOne() : Int = this + 1
Yazdığın extension functionu her yerde kullanmak istersen bu fonksiyonu top-level olarak, yani bir dosyanın içine yazmayı unutmamalısın. Eğer herhangi bir classın içinde extension function tanımlaması yaparsan sadece o classın içinde bu fonksiyonu kullanabilirsin.
Infix Functions
Kodlarımızın daha okunaklı hale getirmek için infix function kullanabiliriz. Infix function kullanabilmenin temel kuralları şöyle sıralayabiliriz:
- Infix function oluştururken en başa infix keywordü yazılır.
- Infix functionlar ya bir üye fonksiyon olmalıdır ya da extension function olmalıdır.
fun main() {
5 sumWithNumber 10
}
infix fun Int.sumWithNumber(number: Int) : Int = this + number
Üye fonksiyon içinde infix function kullanırken en başa this keywordünü eklememiz gerekir yoksa kodumuz derlenmez ve hata verir.
fun main() {
println(RandomClass().randomFunction()) //6
}
class RandomClass() {
val number = 5
infix fun addOne(number: Int) : Int = number + 1
fun randomFunction() : Int {
return this addOne number
//addOne number -> Böyle kullanırsak hata alırız.
}
}
- Infix functionlar tek bir parametre almak zorundadır. Infix functionları kullanma amacamız kod okumayı kolaylaştırmasıdır. Birden fazla parametre vermek veya vararg tipi bir parametre vermek kod okunurluğunu kolaylaştırmaktan çok zorlaştıracağı için buna izin verilmez. Buna benzer bir sebeple infix function yazarken default parametre kullanımına da izin verilmez.
Yazımı okuduğun için teşekkürler! Bir başka konuda görüşmek üzere.
Kaynaklar:
- Halil Özcan
- kotlinlang.org
- Gökhan Öztürk