ProgramlamaKotlin orta düzey geliştirici

Kotlin'da constructor delegation (kurucu delege etme) nedir, secondary/primary kurucuların çağrısı nasıl çalışır ve kullanımının hangi incelikleri vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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.

Sorunun Tarihi

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.

Sorun

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.

Çözüm

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") } }

Ana Özellikler:

  • İkincil yapıçı açıkça bu sınıfın başka bir yapıcısına (birincil ya da ikincil) delege etmelidir.
  • init blokları her zaman birincil yapıcıdan sonra çalışır, ikincil ne şekilde çağrılırsa çağrılsın.
  • Eğer üst sınıfın argüman almayan bir yapıcısı yoksa super(...) çağrısı zorunludur.

Çeldirici Sorular.

İ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.

Tipik Hatalar ve Anti-Patternler

  • Sadece ikincil yapıcılarda başlatma mantığını kullanmaya çalışmak ve init bloklarını unutmamak.
  • Delege etme yoksa ‘secondary constructor must delegate to primary constructor’ hatası.
  • Gereken super yapıcının olmaması nedeniyle üst yapıcının yapıcısının çağrılmasında miras alma zorluğu.

Hayat Örneği

Negatif Durum

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:

  • Daha az kod.

Eksiler:

  • Başlatılmamış özellikler.
  • Zor tespit edilen hatalar.

Pozitif Durum

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:

  • Tüm nesnelerin doğru ve tam olarak başlatıldığından eminlik.

Eksiler:

  • Başlatma sırasının net bir şekilde anlaşılması gerekliliği.