Kotlin Constructor (Yapıcı) Metot

Merhaba arkadaşlar ,
Mobilhanem.com sitesi için anlattığımız / yayınladığımız Kotlin Dersleri serimize kaldığımız yerden devam ediyoruz. Bir önceki dersimizde Nesne ve Sınıf yapısından bahsetmiştik. Bu dersimizde ise Kotlin Constructor yapısı ile devam edeceğiz.

Constructor Nedir? Constructor’a neden ihtiyaç duyarız.

Öncelikle Constructor nedir ondan bahsedelim. Constructor bir sınıftan bir nesne (instance) oluşturulurken o nesnenin başlangıç değerlerinin verilmesine yarayan metot benzeri bir yapıdır. Ne demek istedim ben de tam anlamadım 🙂 Hemen kısa bir örnek vereyim.

class Test{
    val isim: String = "Taha"
    var yas: Int = 30
    
    fun yazdir(){
        print(isim +" " + yas +" yaşında")
    }
}

Yukarıda Test sınıftan bir nesne oluşturup bu nesnenin yazdir() fonksiyonu çağırılırsa:

val test = Test() // Test sınıfından test adında bir nesne oluşturduk
test.yazdir() //test nesnemize ait yazdir fonksiyonunu çağırdık

//Konsol çıktısı:
Taha 30 yaşında

Yukarıda gördüğünüz gibi isim ve yas değişkenleri önceden belirtilmiş olduğumuz için biz bunları değiştiremedik. Ama bizim şöyle bir ihtiyacımız olabilir. Bir sınıftan bir nesne yaratırken onun değerlerinide biz belirleyelim. Yani başlangıç (initial) değerlerini nesneyi oluştururken biz gönderelim. Yukarıda ki örnekten yola çıkarsak ben hangi ismi ve hangi yaşı gönderiyorsam onları ekrana yazdırsın.

İşte bu ve buna benzeri durumlarda yani nesne oluştururken sınıfımız içinde başlangıç değerleri atama işlemlerinde ve ya yapılması gereken başlangıç işlemlerini constructor içinde yaparız. Gelelim bunun kotlinde kullanımına.

Kotlin Constructor Kullanımı

Kotlin’de iki tipte constructor yapısı vardır.

1- Primary Constructor

2- Secondary constructor

İkisininde farklı kullanım alanları vardır. Şimdi bu iki yapıyı hem anlatıp hem örneklendirelim.

1- Primary Constructor

Primary yani birincil constructor direk sınıf adı tanımlanırken sınıf adının yanında tanımlanır ve sadece sınıf içindeki değişkenlere başlangıc değerlerini vermek için kullanılır. Primary constructor içinde kod yazamayız.

Örn :

class Test (val isim: String, var yas: Int){ 
    
    fun yazdir(){
        print(isim +" " + yas +" yaşında")
    }
}

Direk class adı yanında başlangıç değerlerini aldık ve class içinde kullandık. Peki bu sınıftan bir nesne nasıl yaratacağız.

fun main(args: Array<String>) {
    val test = Test(isim = "Taha", yas = 30) //başlangıç değerlerini nesneyi oluştururken gönderdik
    test.yazdir() //yazdir fonksiyonunu çağırdık
}

class Test (val isim: String, var yas: Int){
    fun yazdir(){
        print(isim +" " + yas +" yaşında")
    }
}

//Konsol çıktısı: 
Taha 30 yaşında

Gördüğünüz gibi constructor sayesinde istediğimiz değerleri nesneyi oluştururken biz gönderdik.

Peki ben primary constructor kullanarak gönderdiğim değerler üzerinde ve ya sınıf’a ait başka değişkenler üzerinde başlangıç işlemleri yapmak istersem ne olacak?

Primary’ı Constructor’ı init bloğu ile kullanmak

Yukarıda ki sorduğum sorunun cevabı init bloğu kullanmak diyebilirim. init bloğu içinde primary constructor’da aldığım değerleri istediğim gibi işleyebilir o değerler dışında sınıfa ait başka değerlerinde başlangıç değerlerini verebilirim. Basit bir örnekle anlatmaya çalışayım.

fun main(args: Array<String>) {
    val test = Test(isim = "Taha", yas = 30)
    test.yazdir()
}

class Test (val isim: String, var yas: Int){
    var ekranaBastirilacakYazi: String

    init{
       ekranaBastirilacakYazi = isim + " "+ yas + " yaşında"
    }

    fun yazdir(){
       print(ekranaBastirilacakYazi)
    }   
}

//Konsol çıktısı:
 Taha 30 yaşında

Yukarıda ki örnekte init bloğunu nasıl kullandık anlatayım. Bildiğiniz gibi primary olan cosntructorlarda içeriye herhangi bir kod yazamıyoruz. Sadece başlangıç değerlerini veriyoruz. Ama bazı durumlarda bu başlangıç değerlerini kontrol etmemiz ve ya bu değerleri başka bir değere atamamız gerekebilir. İşte bu gibi durumlarda init bloğunu kullanıyoruz. İnit bloğu içinden direk primary içindeki değerlere ulaşabiliyor ve istediğimiz gibi kullanabiliyoruz.

Ben örneğimde isim ve yas değerlerine ulaşıp bunları ekranaBastirilacakYazi değişkenine atadım ve class’ımın herhangi bir yerinde o değeri kullandım. Yani başlangıç değerlerini alıp farklı bir değere atadım. Örneğin isim’in ve ya yas değerinin boş olup olmadığını, 0’dan farklı olup olmadığını kontrol edip beklediğim değerlerde değilse hata fırlatabilirdim. (Hata fırlatmayı ilerleyen derslerde göreceğiz). Yani yas değerini -5 gönderdiğimiz zaman benim init bloğum bunu kontrol edebilirdi.

fun main(args: Array<String>) {
    val test = Test(isim = "", yas = -5)
    test.yazdir()
}

class Test (val isim: String, var yas: Int){
    var ekranaBastirilacakYazi: String

    init{
        if(yas <= 0){
            //hata fırlat illegal argument
        }else if(isim.length <= 0){
           //hata fırlat illegal argument
        }

        ekranaBastirilacakYazi = isim + " "+ yas + " yaşında"

    }

    fun yazdir(){
        print(ekranaBastirilacakYazi)
    }
}


// 
Hata

Kısaca özet geçmek istersek init bloğu başlangıç değerlerini kontrol etmek ve bunlarla ilgili işlem yapmak için primary constructor ile birlikte kullanılan bir kod bloğudur.

Primary’ı Constructor’ı default (başlangıç) değerle kullanmak

Kotlin fonksiyonlar dersimizi okumuşsanız o dersimizde default değerin ne olduğunu ve nasıl kullanıldığını detaylı anlatmıştık. Burda kısa bir örnekle anlatayım.

fun main(args: Array<String>) {
    val test = Test(isim = "Vehbi",site = "sorucevap.mobilhanem.com")
    test.yazdir()
    
    val test2 = Test(isim = "Taha")
    test2.yazdir()
}

class Test (val isim: String,  val site: String = "Mobilhanem.com"){
      
    var ekranaBastirilacakYazi: String 

    init{
        ekranaBastirilacakYazi = isim + " "+ site + " yazarıdır"
    }

    fun yazdir(){    
        println(ekranaBastirilacakYazi)    
    }
       
}

//Konsol çıktısı:
Vehbi sorucevap.mobilhanem.com yazarıdır
Taha Mobilhanem.com yazarıdır 

Yukarıdaki örnekte ikinci Test nesnemizi oluştururken constructora site adını göndermediğimiz halde default değerini “Mobilhanem.com” verdiğimiz için site değişkenine herhangi bir atama yapılmazsa bile default değeri yani bizim örneğimizde ki “Mobilhanem.com” değerini kullanır. Fonksiyonlar dersimizde daha açıklayıcı anlatmıştım bakabilirsiniz.

2 – Secondary Constructor

Kotlinde sadece bir tane primary constructor olabilirken birden fazla secondary constructor olabilir ve bu constructorlar “constructor” adı ile oluşturulur. Secondary constructorlar primary constructorı çağırmak zorundadırlar (Eğer tanımlı bir primary constructor var ise). Peki neden ihtiyaç duyarız ikinci bir costructora.  Mevcut olan bir class’dan bir instance yaratırken farklı farklı değerlere başlangıç değeri vermek isteyebiliriz.

Örnek:

fun main(args: Array<String>) {
    val test: Test = Test("Taha")
    test.yazdir() // Taha'nın yaşı 0 -> çnkü ilk constructor çağırıldı sadece isim değeri atandı yaş değeri atanmadı 

    val test2: Test = Test("Taha", 30)
    test2.yazdir() //Taha'nın yaşı 0
}

class Test{
    var isim: String
    var yas: Int = 0
    
    constructor(isim: String){
        this.isim = isim
    }
    
    constructor(isim: String, yas: Int){
        this.isim = isim
        this.yas = yas
    }
    
    fun yazdir(){
        println(isim + "'nın yaşı "+ yas)
    }
}

Secondary constructor’lar birbirlerini çağırabilirler. Bunu this keywordu ile yaparlar.

Örnek:

fun main(args: Array<String>) {
    val test: Test = Test("Taha")
    test.yazdir() // Taha'nın yaşı 0 -> çnkü ilk constructor çağırıldı sadece isim değeri atandı yaş değeri atanmad
    val test2: Test = Test("Taha", 30)
    test2.yazdir() //Taha'nın yaşı 30
}

class Test{
    var isim: String
    var yas: Int = 0
    
    constructor(isim: String){
        this.isim = isim
    }
    
    constructor(isim: String, yas: Int){
        this(isim)  //burada direk isim değişkenine atama yapmayıp bu işlemi yapan diğer constructorı çağırdık
        this.yas = yas
    }
    
    fun yazdir(){
        println(isim + "'nın yaşı "+ yas)
    }
}

Yukarıda ikinci constructor birinci constructor’ı çağırıyor.

Bu dersimde sizlere Kotlin Constructor yapısını anlatmaya çalıştım. Bol örnekler vererek pekiştirdik. Bu örnekleri https://try.kotlinlang.org online ide ile deneyebilirsiniz. Umarım işinize yaramıştır. Bir sonraki dersimde Kotlin Erişim Belirleyiciler konusunu sizlere anlatmaya çalışacağım.

Bir sonraki dersimde görüşmek dileğiyle …

 

49

Taha Kırca

iOS & Android & Apple Watch Developer, Mobilhanem.com yazarı, Karadeniz Uşağu, Ordu Sevdalısı

9 Yorum

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?