ProgramlamaKotlin/Java geliştirici

Kotlin'da yapıcı miras nasıl çalışır, super yapıcının çağrılması nasıl olur ve birincil ve ikincil yapıcıların birleştirilmesinde hangi sorunlar vardır? Farklı durumlar için örnek verin, Java ile olan farkları açıklayın.

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

Cevap

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:

  • Eğer üst sınıfın zorunlu parametreleri olan bir birincil yapıcısı varsa, türetilmiş sınıfın her zaman bunu : super(...) ile açıkça çağırması gerekir.
  • İkincil yapıcıda, üst sınıf super(...) üzerinden ya da başka bir ikincil/birincil yapıcı aracılığıyla çağrılır.
  • Başlatma çakışmasına izin verilmez: tüm alanlar her zaman doğru bir şekilde başlatılmalıdı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 üst sınıfın yapıcısını çağırmadan yoktur.
  • Birincil yapıcı her zaman temel parametreleri başlatır ve örtük olabilir.

Kandırmaca Sorusu

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ı!

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri


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.