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.
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:
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
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ı.