ProgramlamaBackend Geliştirici

Kotlin'de 'object' operatörü ile çalışma inceliklerini açıklayın: singleton nesneleri, nesne ifadeleri, nesne beyanları ve arkadaş nesneleri nedir. Kullanım örnekleri ve olası hataları verin.

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

Cevap.

Kotlin, object anahtar kelimesi ile klasik singleton kavramını genişletir. Bununla birlikte şu kalıplar uygulanmaktadır:

  • Nesne Beyanı (object declaration) — uygulama genelinde tek bir örnek oluşturur (object Logger { ... }).
  • Nesne İfadesi (object expression) — arayüzlerin veya olay işleyicilerinin uygulanması için doğrudan kullanım yerine anonim bir nesne oluşturur.
  • Arkadaş Nesneleri (companion object) — sınıfta statik üyelerin tanımlanmasını sağlar.

Singleton nesne örneği:

object DatabaseManager { fun connect() { /*...*/ } } DatabaseManager.connect()

Nesne ifadesi:

val listener = object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { /*...*/ } }

Arkadaş nesne:

class User { companion object Factory { fun create(name: String) = User() } } val user = User.create("Ivan")

İncelikler:

  • Arkadaş nesneleri, byte kod seviyesinde statik alanlar olarak görünür.
  • Arkadaş nesneleri arayüzleri uygulayabilir.
  • Nesne ifadesi singleton değildir, her erişildiğinde yeni bir nesne oluşturur.
  • Nesne beyanı, ilk erişimde tembel bir şekilde başlatılır.

Kandırmaca Soru.

Arkadaş nesne ile nesne beyanı arasındaki fark nedir? Üyeleri statik olarak erişilebilir mi?

Cevap:

  • object declaration — genel singleton, sınıf, arayüz veya dış seviyedeki bir üye.
  • companion object — sınıf içinde bir nesne beyanının özel bir türü olup, üyeleri sanki statikmiş gibi (sınıf adı üzerinden) çağrılabilir. Ancak Java'dan farklı olarak, aslında bir singleton nesneesinin alanlarıdır.

Farkın örneği:

class A { companion object { fun foo() {} } object NestedObj { fun bar() {} } } A.foo() // TAMAM A.NestedObj.bar() // TAMAM, ama bu statik bir yöntem değil

Gerçek hatalara dair örnekler, konunun inceliklerinden habersiz olmaktan kaynaklanan.


Hikaye

Geliştirici, nesne beyanı içinde değiştirilebilir bir durum tanımladı ve bunu farklı iş parçacıklarından senkronize olmadan kullanmaya başladı; singleton nesnelerin tüm uygulama boyunca paylaşıldığını dikkate almadı ve race condition sorununa neden oldu.


Hikaye

Sınıf içinde arkadaş nesne yerine nesne tanımlarken statik yöntemlerin kullanılması gerekiyordu, ancak örnek üzerinden çağırmak zorunda kaldılar, bu da okunabilirliği düşürdü ve Java'dan geçişte hatalara neden oldu.


Hikaye

UI kodunda programcı, olay işleyicisi için her seferinde nesne ifadesi aracılığıyla yeni bir nesne oluşturdu. Orada singleton olduğunu ve durumun korunacağını yanlışlıkla düşündü; sonuç olarak yaşam döngüsünü yanlış yönetim nedeniyle bellek sızıntıları meydana geldi.