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.
Companion olarak adlandırılır.class MyFactory private constructor(val value: Int) { companion object { fun create(x: Int): MyFactory = MyFactory(x) } } val instance = MyFactory.create(10)
Neden çok iş parçacıklı uygulamalarda
companion objectiçinde durum (örneğin, değişkenler) saklanması önerilmez?
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
Hikaye
Android projesinde geliştiriciler, hata ayıklayıcıyı yönetmek için çevresel yapılandırmayı
companion objectiç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 objectiç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.