Kotlin Constructor (Kurucu) Oluşturmak
Öncelikle constructor (kurucu) metotları iyi anlayabilmek için sınıf ve nesne kavramlarını da bilmemiz gerek. Sınıf ve nesne kavramlarına buraya tıklayarak ulaşabilirsiniz.
Kotlin programlama dilinde, classların object olarak tanımlanmasındaki altyapıyı hazırlayan, constructor (kurucu) özelliğini barındıran class ismiyle aynı isme sahip olan geriye değer döndürmeyen metotlara “constructor (kurucu) method” olarak tanımlarız.
Constructor Method Ne İşe Yarar?
Uygulama içerisinde yaptığımız tanımlamaları sınıfı çağırırken gerçekleştirmek istersek, bunu constructor metot sayesinde yapabiliriz.
Constructor Metotların Kotlin’de Tanımlanma İşlemleri
- Öncelikle, tanımlanan methodun ismi class ismi ile aynı olmak zorundadır.
- Constructor methodlar geriye herhangi bi değer döndürmediklerinden veri tipleri ile tanımlanamazlar.
- Constructor metodu tanımlarken primary (birincil) constructor için “constructor” anahtar kelimesinin kullanımı gereksizdir. Örneğin,
class Personel constuctor(var name:String)
// Doğru ancak, gereksiz "constructor" anahtar sözcüğü
{
}
class Personel(var name:String) // Doğru kullanım
{
}
Şimdi constructor method için örnek verelim.
class Personel(var name:String, var age:Int)
{
fun userInfo()
{
println("$name, $age")
}
}
fun main(args: Array<String>)
{
var personel : Personel = Personel("adem", 42)
personel.userInfo()
}
Kotlin programlama dilindeki constructor metodun tanımlanması C# programlama dilinden biraz farklı, orada direk class ismi ve metot ismini aynı anda belirtip, metot ile ayrı tutabiliyorduk. Kotlinde ise primary constructor ile class tamamen birleşik. Class referans alınıp çağırıldığında ilk işlemini gerçekleştirmek istediğimiz metodu “init” anahtar sözcüğü ile belirtiriz. Bu “init” anahtar sözcüğü ne zaman nesne türetilse ilk tetiklenen metot olacaktır. Örnek ile daha iyi anlaşılacaktır.
class Personel(var name:String, var age:Int)
{
var personelName : String
var personelAge : Int
init
{
personelName = name
if(age<18)
{
personelAge=18
}
else
{
personelAge = age
}
}
fun userInfo()
{
println("$personelName, $personelAge")
}
}
fun main(args: Array<String>)
{
var personel : Personel = Personel("adem", 42)
var personel2 : Personel = Personel("veli", 12)
personel.userInfo()
personel2.userInfo()
}
Burada bir önceki örnekten farklı olarak, name ve age parametrelerini alırken eğer age bilgisi 18’den düşük girilirse, bunu otomatik olarak 18 kaydettik. Bu işlemi class ilk çağırıldığında çalıştırmak istiyoruz. Dolayısıyla bunun için “init” anahtar sözcüğünü kullandık. Burada dikkat edilirse, nesne ne zaman üretilirse ilk tetiklenen init bloğu olacaktır. Uygulamamız çıktı olarak aşağıdaki sonucu verecektir;
adem, 42
veli, 18
Şimdi gelelim Secondary Constructor oluşturmaya. Öncelikle nedir bu secondary constructor? Secondary constructor, Türkçe adıyla ikincil kurucu metot, aslında constructor method overloading işlemidir. Daha önceden method overloading işleminin ne olduğunu göstermiştim. Dolayısıyla, aynı isimde farklı sayıda ve tipteki parametreler constructor method içerisinde var olabilir. Eğer bir sınıfta birden fazla kurucu method varsa, ilk olana birincil, ikincisine ikincil, üçüncüsüne üçüncül… diyebiliriz. Yani, buradan constructor methodların overload edilebileceği çıkarımını yapabiliriz. Peki, şimdi bunların nasıl kullanılabileceğini gösterelim.
Yukarıdaki örneğimizde buna ek, personelimizin şehir bilgisini de almak isteyelim ve bunu secondary constructor kullanarak yapalım.
class Personel(var name:String, var age:Int)
{
var personelName : String
var personelAge : Int
var personelCity : String = ""
init
{
personelName = name
if(age<18)
{
personelAge=18
}
else
{
personelAge = age
}
}
constructor(name:String, age:Int, city:String) : this(name, age)
{
this.personelCity = city
}
fun userInfo()
{
println("$personelName, $personelAge, $personelCity")
}
}
fun main(args: Array<String>)
{
var personel : Personel = Personel("adem", 42)
var personel2 : Personel = Personel("veli", 12)
var personel3 : Personel = Personel("Tuncay", 21, "Bükreş")
personel.userInfo()
personel2.userInfo()
personel3.userInfo()
}
Burada dikkat edilmesi gereken nokta, ikincil constructor methodu çağırdımızda birinciyi de mutlaka dahil etmemiz gerektiği, bunu “this” anahtar sözcüğü ile gerçekleştiririz.
constructor(name:String, age:Int, city:String) : this(name, age)
Burada :this(name, age) yazmasaydık derleyici bize “Primary constructor call expected” hatasını yani “birincil kurucunun da çağrılması bekleniyor” hatası verecektir. Yukarıdaki uygulamamız aşağıdaki çıktıyı verecektir;
adem, 42,
veli, 18,
Tuncay, 21, Bükreş
class Personel(var name:String, var age:Int)
{
var personelName : String
var personelAge : Int
var personelCity : String = ""
var personelTel : String = ""
init
{
personelName = name
if(age<18)
{
personelAge=18
}
else
{
personelAge = age
}
}
constructor(name:String, age:Int, city:String) : this(name, age)
{
this.personelCity = city
}
constructor(name:String,age:Int, city:String, tel:String) : this(name, age, city)
{
this.personelTel = tel
}
fun userInfo()
{
println("$personelName $personelAge $personelCity $personelTel")
}
}
fun main(args: Array<String>)
{
var personel : Personel = Personel("adem", 42)
var personel2 : Personel = Personel("veli", 12)
var personel3 : Personel = Personel("Tuncay", 21, "Bükreş")
var personel4 : Personel = Personel("Burak", 52, "Ankara", "1234567")
personel.userInfo()
personel2.userInfo()
personel3.userInfo()
personel4.userInfo()
}
Buradaki üçüncül kurucu metodumuz için telefon bilgisi ekledim this(name, age, city) kısmına dikkat edersek, bir önceki ikincil kurucuda oluşturduğumuz city kısmını bu kurucuda da kullanmak istiyorsak kullanmak istediğimiz parametreyi de eklememiz gerekmektedir. Kullanmak istemiyorsak, eklenmesi zorunlu değildir. Ancak, birincil kurucuda eklenen parametreler mutlaka diğer kurucu metotlarda dahil edilmek zorundadır. Uygulama çıktısı aşağıdaki gibi olacaktır;
adem 42
veli 18
Tuncay 21 Bükreş
Burak 52 Ankara 1234567