Sobes.tech
Junior

Kotlin programlama dilinde genişletmeler nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Kotlin'deki genişletmeler, mevcut sınıflara yeni fonksiyonlar veya özellikler eklemeye olanak tanır; kalıtım veya dekoratör kullanmadan.

Ana kavramlar:

  • Genişletme fonksiyonları: Sınıflara yeni metodlar ekler.

    // Genişletme fonksiyonunun tanımı
    fun String.removeWhitespaces(): String {
        return this.filter { it.isWhitespace().not() }
    }
    
    // Genişletme fonksiyonunun kullanımı
    val myString = " Hello World "
    val cleanedString = myString.removeWhitespaces() // cleanedString "HelloWorld" olacak
    

    Genişletme fonksiyonundaki this anahtar kelimesi, genişletmenin çağrıldığı nesneye atıfta bulunur (örneğin yukarıdaki örnekte myString).

  • Genişletme özellikleri: Sınıflara yeni özellikler ekler, ancak durumları olamaz, yani veri saklayamazlar. Her erişimde hesaplanırlar.

    // Genişletme özelliğinin tanımı
    val <T> List<T>.lastIndex: Int
        get() = size - 1
    
    // Genişletme özelliğinin kullanımı
    val myList = listOf(1, 2, 3)
    val indexLast = myList.lastIndex // indexLast 2 olacak
    

    Genişletme özellikleri getter içermelidir. Setter isteğe bağlıdır.

Özellikler:

  • Statik yönlendirme: Genişletmenin çağrısı, nesnenin çalışma zamanındaki tipi değil, değişkenin tipine göre belirlenir. Bu, nesne yönelimli programlamadaki sanal metodlardan farklıdır.

    open class Parent
    class Child : Parent()
    
    fun Parent.printType() = println("Parent")
    fun Child.printType() = println("Child")
    
    val p: Parent = Child()
    p.printType() // "Parent" yazdırır, çünkü değişken tipi Parent'tır
    
  • Özel ve protected üyeler: Genişletmeler, genişlettikleri sınıfın özel veya protected üyelerine erişemez.

  • Companion Object Genişletmeleri: Bir sınıfın companion nesneleri genişletilebilir.

    class MyClass {
        companion object {
            fun create() = MyClass()
        }
    }
    
    fun MyClass.Companion.printName() = println("MyClass Companion")
    
    MyClass.printName() // "MyClass Companion" yazdırır
    
  • Görünürlük (Visibility): Genişletmeler, başka dosyalarda kullanılmak üzere bir dosyada tanımlanmalı ve içe aktarılmalıdır.

Genişletmeler, okunabilir ve esnek kod oluşturmak için güçlü bir araçtır; üçüncü taraf kütüphanelerinin sınıflarına fonksiyonellik eklemeye olanak tanır, kaynak kodlarını değiştirmeden.