ProgramlamaBackend Geliştirici

Kotlin'de companion object nedir, özellikleri ve sınırlamaları nelerdir? Fabrika yöntemleri ve statik durum oluşturmak için companion object'ler nasıl kullanılır?

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

Cevap.

Kotlin'de companion object (companion object), bir sınıf içinde companion anahtar kelimesi ile tanımlanan bir nesnedir ve Java'daki statik üyeler gibi statik yöntemler ve özellikler gruplamaya olanak tanır. Java'daki static ile karşılaştırıldığında, Kotlin'deki her companion object tam bir nesnedir ve bytecode düzeyinde onun üyelerine erişim statik olarak derlenir.

Temel özellikler ve sınırlamalar:

  • Varsayılan ad — açıkça belirtilmezse, nesne Companion olarak adlandırılır.
  • Companion object herhangi bir arayüzü uygulayabilir, bu nedenle örneğin, fabrika yöntemleri oluşturmak için kullanışlıdır.
  • Companion object içinde dış sınıfın özel üyelerine erişim vardır.
  • Her sınıfta yalnızca bir adet companion object olabilir.
  • Companion object üyelerine, sınıf adıyla statik olarak veya nesne üyeleri gibi erişilebilir.

Örnek:

class MyFactory private constructor(val value: Int) { companion object { fun create(x: Int): MyFactory = MyFactory(x) } } val instance = MyFactory.create(10)

Şaşırtıcı soru.

Neden çok iş parçacıklı uygulamalarda companion object içinde durum (örneğin, değişkenler) saklanması önerilmez?

Örnekle cevap:

Eğer değişken durum companion object içinde yer alıyorsa, bu durum sınıfın tüm örnekleri ve iş parçacıkları arasında paylaşılan bir hale gelir ve ek senkronizasyon olmadan yarış durumu (race condition) oluşur.

class Counter { companion object { var count = 0 fun increment() { count++ } } } Counter.increment() // eşzamanlı çağrılarda yarış durumu

Konunun inceliklerinden dolayı gerçek hataların örnekleri.


Hikaye

Android projesinde geliştiriciler, hata ayıklayıcıyı yönetmek için çevresel yapılandırmayı companion object içine yerleştirdi. Bu, farklı parçaların aynı küresel değeri değiştirmesiyle karışıklığa yol açtı ve asenkron geçişlerde beklenmedik davranışlar ortaya çıktı.


Hikaye

Backend'de bazı işlevler, değişken bir önbellekle birlikte companion object içine yerleştirildi. Yüksek yük altında bir hata oluştu ve senkronizasyon eksikliğinden dolayı veri tutarsızlıkları meydana geldi.


Hikaye

Yeni başlayan bir geliştirici, sınıfı bu arayüz olarak kullanabileceğini düşünerek yalnızca companion object içinde bir arayüz uygulamaya çalıştı. Sonuç olarak, companion'ın davranışının yalnızca sınıfa bağlı olan tek nesne olduğunu ve bu nedenle bir sınıf yerine companion object geçiremeyeceğini fark etti.