ProgramlamaKotlin geliştirici

Kotlin'de constructor'ların görünürlüğü ve miras alınmasıyla ilgili detayları açıklayın: birincil ve ikincil constructorlar arasındaki farklar, miras alma ile ilgili nüanslar ve görünürlük modifikatörleri. Kod örnekleri ve yaygın hatalar verin.

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

Cevap.

Kotlin'de her sınıfın bir birincil constructor (sınıfın tanımında belirtilir) ve birden fazla ikincil constructor (constructor anahtar kelimesi ile) olabilir.

  • Birincil constructor, tanımın dışında kod içermeyebilir (mantık init içinde yer alır).
  • İkincil constructor, ek başlatma seçeneklerini gerçekleştirir.
  • Eğer ebeveynin parametresiz bir constructor'ı yoksa, miras alan sınıf açıkça onun constructor'ını çağırmak zorundadır.
  • Görünürlük modifikatörleri (private, protected, internal, public) kullanarak constructor'ların görünürlüğünü gizleyebilir veya kısıtlayabilirsiniz.

Birincil ve ikincil constructorlar ile örnek:

open class Person(val name: String) { constructor(name: String, age: Int) : this(name) { // ikincil constructor } } class Employee : Person { constructor(name: String) : super(name) // Açık bir super çağrısı zorunludur }

Görünürlük modifikatörleri:

class Secret private constructor() { companion object { fun create() = Secret() } } val s = Secret.create() // Tamam, ama Secret() - hata

Nüanslar:

  • Eğer birincil constructor'a sahip bir sınıfın parametreleri varsa, bu parametreleri aktarmadan miras alınamaz.
  • İkincil constructor'lar kesinlikle birincil constructor'ı doğrudan veya dolaylı olarak çağırmak zorundadır.
  • İç sınıflar, dış sınıfın private constructor'ına erişemez.

Tuzaklı soru.

Kotlin’de bir sınıf miras alırken birincil constructor’ını çağırmadan miras almak mümkün mü?

Cevap: Hayır. Kotlin'de miras alırken her zaman en az bir ebeveyn constructor'ı — ya birincil ya da ikincil (super() ile) — çağrılmalıdır.

Örnek:

open class A(val x: Int) class B: A // Hata: A'nın constructor'ını açıkça çağırmak gerekiyor

Konunun inceliklerine dair gerçek hata örnekleri.


Hikaye

Ekibimiz, sınıf nesnelerinin doğrudan oluşturulmasını yasaklamaya çalıştı ve constructor'ı private yaptı. Ancak fabrika yöntemini uygulamayı unuttular. Bu, sınıfı test etmenin imkansız hale gelmesine ve CI'nın engellenmesine yol açtı.


Hikaye

Birincil constructor'da zorunlu parametreleri olan bir sınıf miras alındı, ancak miras alan sınıfın tanımında bu parametreler iletilmedi. Bu durum, uzun bir hata ayıklama sürecinden sonra yalnızca derleme aşamasında fark edildi.


Hikaye

İkincil constructor'ları kullanırken, hepsinin birincil constructor'ı çağırmak zorunda olduğunu unuttular. Sonuç olarak, nesneler gerekli parametreler olmadan başlatıldı ve bu, çalışma zamanında NullPointerException'a yol açtı.