Object & Companion Object

Object:

Sümeyra Özuğur🍂
2 min readApr 25, 2023

--

  • Object, “object declaration” olarak tanımlanır. Object declarationlar thread-safe ve lazy olarak init edilir.

thread-safe: Bir bileşen veya kod parçacığı “thread safe” ise, aynı anda birden fazla iş parçacığı tarafından çağrıldığında hatalı sonuçlar veya hatalı davranışlara yol açmadan doğru sonuçlar elde edebilir. Burada objenin oluşması thread safe, içindeki methodlar thread safe olmayabilir.

lazy-initialize: Kodda ilk çağrıldıkları zaman oluşurlar

  • Kotlinde Singleton patternin uygulanma şekli(bir kez oluşturulduğunda artık hep aynı instance kullanır).
  • Kendi ismi ile ulaşılır.

Object’in de temeli aslında statik bir yapıya dayanıyor ama daha özelleştirilmiş hali şeklinde düşünebilirsiniz.

object{
val pi = 3.14
}
class Value{
companion object{
val pi = 3.14
}
}

Companion Object:

  • Çağrılmasalar bile o sınıf üretildiği anda bellekte yer kaplarlar.
  • Her sınıfın yalnızca bir companion object’i olabilir
  • Java daki statik kavramıyla bağdaştırılır.
  • Class ismi yardımı ile ulaşılır.
  • Spesifik bir obje yerine, class seviyesinde bir özelliğe ihtiyaç varsa tercih edilir.

Ek olarak statiklerin, programın çalışma süresinin tamamına uyan ömürleri vardır. Bu demektir ki, sınıfınızı kullandıktan sonra bile, tüm bu static değişkenlere çöp toplayacılar (Garbage Collector) dokunamaz. Yine bu demektir ki😅 bellek açısından bu kısmı dikkatli kullanmalıyız.

Statiği kullanabilceğimiz minik bir örnek verelim daha sonra bunlardan hangisi tercih edeceğinizi size bıraklım😃.

Örnek: Diyelimki sürekli bir sayfadan diğer sayfaya geçiş yapıyorsunuz ve geri geliyorsunuz. Burada o sayfa geçiş yaptığınızda arka sayfadaki yapılar garbage collector tarafından siliniyor. Geri gelince tekrar oluşuyor. Diğer sayfa içinde bu durum geçerli. Sürekli bir zikzak durumu var. Burada bariz bir şekilde performance kaybı var. İşte burada statik kullanılması daha verimli bir yol olabilir.

🎃Farklı sınıfların içinde bu değişkene ihtiyacım varsa ve shared view model ile kurataramıyorsam kesinlikle static kullanmalıyım.

Dipnot: Static yapıların içinde immutable yapılar tutulması tercih edilir. Mutable tutulacaksa bir daha bir düşünmek lazım😅.

Dipnot2: Class ları Singleton yapmak yerine dependency injection kullanılması tavsiye edilir. Peki neden?

  • Process death olayı olduğu zaman, statikler garbage collector tarafından toplanıyor. Tekrar uygulamamız açıldığı zaman, statiklerin tuttuğu verileri bulamaz(garbage collector toplamıştır.) ve memory leak oluşur:(

Process Death: Çalışan bir programın veya işlemin beklenmedik bir şekilde sonlandırılması veya çökmesidir. Sistem kaynaklarının yetersiz olması, kullanıcının doğrudan kapatması, hata gibi durumlarda process death olayı yaşanır.

  • Singleton class yerine dependency injecton kullanarak yapımızı oluştursaydık nasıl olurdu? Bu seferde tekrar uygulama açılınca gerekli bağımlılıklar yeniden bağlanarak işlemini devam ederdi. Herhangi bir sorun oluşmazdı.

Şimdilik bu kadar, kendinize cici bakın, başka bir yazıda görüşmek üzere…

Kaynak:

--

--