Konunun Tarihçesi:
Kotlin, nesnelerin bildirimini ve başlatılmasını Java ile karşılaştırıldığında basitleştirmiştir. Dil, birincil (primary constructor) ve ikincil (secondary constructors) iki tür yapıcı içerir. Bu, geliştiricilerin başlatma sürecini kontrol etmelerini ve sınıf örneklerinin oluşturulmasında daha esnek bir yönetim sağlamalarını mümkün kılar.
Sorun:
Kotlin programlamasında, yapıcı türleri arasındaki net ayırımın ne tür faydalar sağladığını ve bunun kodun okunabilirliği, güvenliği ve genişletilebilirliği üzerindeki etkilerini anlamak önemlidir. Yaygın bir hata, yanlış kombinasyonlar veya başlatma üzerindeki geçersiz yeniden tanımlamalardır; bu da beklenmedik hatalara yol açabilir.
Çözüm:
Kotlin'de birincil yapıcı, sınıfın isminin hemen ardından bildirilir ve constructor anahtar kelimesi ile genişletilebilir. İkincil yapıcılar, sınıfın gövdesinin içinde bildirilir ve her zaman başka bir yapıcıya this() ile veya temel yapıcıya super() ile devretmelidir.
Kod örneği:
class User(val name: String) { // birincil yapıcı var age: Int = 0 constructor(name: String, age: Int) : this(name) { // ikincil yapıcı this.age = age } }
Anahtar özellikler:
init bloğu ile yapıcı gövdesi arasındaki fark nedir?
init bloğu, nesne her oluşturulduğunda herhangi bir yapıcı aracılığıyla genel bir başlatma için kullanılırken, ikincil yapıcı gövdesi yalnızca belirli bir ikincil yapıcı çağrıldığında çalıştırılır.
class Example(val x: Int) { init { println("x = $x ile Başlatıldı") } constructor(x: Int, y: Int) : this(x) { println("İkincil yapıcı y = $y ile çağrıldı") } }
İkincil yapıcıdan vazgeçip sadece birincil yapıcıyı kullanmak mümkün mü?
Evet, eğer sınıfınızın tüm mantığı özelliklerin başlatılması ve init blokları ile kapsanabiliyorsa. İkincil yapıcı, yalnızca özel aşırı yükleme veya belirli mantık gerektiren durumlar için gereklidir.
Eğer ikincil yapıcı birincil yapıcıya devretmezse ne olur?
Kotlin'de bu yasaktır — derleyici bir hata verir: her ikincil yapıcı, ya başka bir ikincil yapıcıyı ya da birincil yapıcıyı this() ile açıkça çağırmak zorundadır.
Projede her sınıf başlatma seçeneği için çok sayıda ikincil yapıcı eklendi, bu da kodun ağırlaşmasına neden oldu.
Artılar:
Eksiler:
Farklı nesne oluşturma senaryoları için birincil yapıcı, init bloğu ve companion object içinde fabrika yöntemleri kullanıldı.
Artılar:
Eksiler: