Kotlin'de her sınıfın bir primary constructor (birincil) ve birden fazla secondary constructor (ikincil) olabilir. Constructor delegation — ikincil yapıcının ya doğrudan birincil yapıcıyı ya da o sınıfın başka bir ikincil yapıcısını çağırması gereken bir mekanizmadır (ve sonunda birincil). Eğer bir sınıf başka bir sınıftan miras alıyorsa, her ikincil yapıcı alt sınıf, gerekliyse üst sınıfın yapıcısını açıkça delege etmelidir.
Java’da yapıcılar doğrudan birbirlerini this() veya super() ile çağırabilir ve çeşitli kombinasyonlarda yapıcıları aşırı yükleyebilirler. Kotlin'de bu kavram resmileştirilmiştir: bir sınıf yalnızca bir tane birincil yapıcıya sahip olabilir, ikincil yapıcılar kullanılması gereken delege etme mantığını açıkça belirtmelidir.
Delege etmenin hatalı uygulanması derleme hatalarına yol açabilir: eğer birincil yapıcı tanımlandıysa çağrılmazsa ya da miras alınan sınıfta varsayılan yapıcı yoksa süper yapıcı çağrılmazsa hata oluşur. init bloklarının hangi anda çağrıldığını, parametrelerin nasıl geçirildiğini ve delege etmenin başlatma sırasını nasıl etkilediğini anlamak önemlidir.
Temel delege etme örneği:
class Person(val name: String) { constructor(name: String, age: Int) : this(name) { println("İkincil yapı: $name, $age") } }
Eğer miras alındığında:
open class Parent(val name: String) class Child : Parent { constructor(name: String) : super(name) { println("Çocuk ikincil: $name") } }
İkincil yapıcı hiç kimseye delege etmeyebilir mi?
Hayır, derleyici this(...) veya super(...) çağrısının açıkça yapılmasını isteyecektir, aksi takdirde hata oluşur.
Eğer ikincil yapıcı kullanılıyorsa başlatmalar ve init blokları hangi sırayla çalışır?
İlk olarak her zaman birincil yapıcı ve init blok(lar) çağrılır, ardından ikincil yapıcının başlatma kodu çalışır.
class Demo(val value: String) { init { println("init blok") } constructor(value: String, code: Int) : this(value) { println("ikincil: $code") } } Demo("kotlin", 7) // çıktı: // init blok // ikincil: 7
Bir mirasçı, sadece üst yapıcının birincil yapıcısını çağırabilir mi, eğer onun ikincil yapıcıları varsa?
Evet, ancak sadece açıkça super(...) üzerinden, ikincil yapıcılar mirasçılara doğrudan görünmez.
Bir projede ikincil yapıcı birincil yapıcıyı çağırmıyorsa, hayati öneme sahip başlatma (örneğin zorunlu alanların ayarlanması) gerçekleşmez, bu da hatalara ve çalışma zamanı hatalarına yol açar.
Artılar:
Eksiler:
Tüm ikincil yapıcılar kesinlikle this(...) üzerinden delege ederse, gerekli başlatma merkezi bir şekilde birincil/init içerisinde olur, yapı bakım için şeffaftır.
Artılar:
Eksiler: