Kotlin'de bir sınıfın bir birincil yapıcısı ve istediği kadar ikincil yapıcısı olabilir. Java'dan farkı — Kotlin'de birincil yapıcı sınıfın başında tanımlanır ve parametreler ve modifikatörler içerebilir. İkincil yapıcılar ya başka bir ikincil yapıcıyı ya da birincil yapıcıyı ya da üst sınıfın yapıcısını çağırmalıdır (bu super anahtar kelimesi ile yapılır).
Ana özellikler:
: super(...) ile açıkça çağırması gerekir.super(...) üzerinden ya da başka bir ikincil/birincil yapıcı aracılığıyla çağrılır.Miras ile kullanım örneği:
open class A(val a: Int) { constructor(a: Int, str: String) : this(a) { println("A'daki İkincil: $str") } } class B : A { constructor(a: Int) : super(a) { println("B'deki İkincil") } constructor(a: Int, s: String) : super(a, s) { println("B'deki İkincil #2") } }
Java'dan farkı:
Kotlin'de bir alt sınıf oluşturabilir miyiz, eğer üst sınıfta sadece belirli bir yapıcı varsa, üst sınıfın yapıcısını açıkça çağırmadan?
Cevap: Hayır, Java'dan farklı olarak, Kotlin'de üst sınıfın yapıcısını çağırmak zorunludur ve ya sınıfın "başında" ya da : super() anahtar kelimesinden sonra açıkça belirtilmelidir.
Hata örneği:
open class Base(val x: Int) class Derived : Base // Derleme hatası!
Hikaye
Mikro hizmet projesinde Kotlin'e geçişten sonra üst yapıcıyı açıkça belirtmeyi unuttular: zorunlu parametreye sahip üst sınıfın yapıcısı çağrılmadı, servis derlenemedi, imzaları yeniden düzenlemek gerekti.
Hikaye
Android projesinin derin bir hiyerarşisi vardı (Activity → BaseActivity → CustomActivity), ikincil yapıcının eklenmesi, parametreleri kaybetti, en nihayetinde yanlış temel yapıcının çağrılmasına neden oldu ve bazı alanlar null kalıyordu — uygulama runtime’da NPE ile çökmekteydi.
Hikaye
Açık kütüphane kodunda ikincil yapıcı, başlangıç yapıcısını tesadüfen atladığı için, bazen alan başlatıldı, bazen ise başlatılmadı. Hata, karmaşık hata raporları ile uzun bir süre sonra tespit edildi.