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