Kotlin, object anahtar kelimesi ile klasik singleton kavramını genişletir. Bununla birlikte şu kalıplar uygulanmaktadır:
object Logger { ... }).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ş 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
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.