Kotlinde Singleton Pattern, Object Expression ve Companion Object

Singleton Pattern

İsmail Talha DENGİZ

--

Singleton Pattern tasarım şablonlarındandır. Pattern kullanımlarındaki temel amaç kodu daha okunaklı hale getirmek, test yapılabilir hale indirgemek ve performansta kazanç sağlamaktır. Yanlış kullanımında ise tam tersi sonuçlara yol açabilir.

Singleton kullanımındaki amaç ise, bir classtan sadece bir nesne oluşturulmasını sağlamak ve uygulamanın çalışma zamanında bu nesnenin silinmeyeceğini garanti altına almaktır. Singleton kullanımıyla Garbage Collector tarafından temizlenmeyen bir alan oluşturmuş oluruz ve yanlış kullanımında memory leak(out of memory) hatası alırız.

Mantığını anlamak adına ilk önce Java üzerinden gidelim. Eğer biz uygulamanın yaşam döngüsü boyunca classın bir nesnesinin olmasını istiyorsak;

1- Classın constructurı private yapılır.

2- Class tipinde private static bir üye değişken oluşturulur.

3- Public static bir methodla nesne varsa geri döndürülür, yoksa oluşturulur.

Kod içerisinde yorum satırlarıyla biraz daha anlaşılacaktır.

Kotlinde ise class keywordü yerine object(Object Declaration) keywordü yazdığımızda tüm bu işlemleri gerçekleştirmiş oluruz.

Object Expression

Open veya abstract yapıdaki bir classa bir interface implement etmek yerine o classın nesnesine implement edilme işlemidir. Classın birden fazla yerde kullanıldığı durumlarda interface implement ettiğimizde, override zorunlu olan methodları classın kullanıldığı yerlerde de override etmek zorundayız ve biz diğer kullanım yerlerinin değişmesini istemiyor ve sadece ihtiyaç duyulan nesnede o interfacesi kullanmak istiyorsak bu gibi senaryolarda object expression kullanılır.

Bir class olarak gruplamak istemediğimiz değişkenler için de object expression kullanılabilir. Şöyleki student isminde bir değişkenimiz olsun ve bu değişkenin name ve age şeklinde iki özelliği olsun. Object expression ile bu yapı aşağıdaki şekilde oluşturulur:

Companion Object

Classlardan bir nesne oluşturup o nesne ile class içerisindeki property ve methodlara erişiyorduk. Fakat bazı durumlarda (hafızayı verimli kullanmak gibi) nesne oluşturmadan classın property ve methodlarına erişmek isteyebiliriz(Singleton kullanımına benzer). Bu işlem Javada static fonksiyon ve static property tanımlayarak yapılıyordu. Kotlinde ise companion object ile yapılır.

Object keywordünden önce companion keywordü eklenerek class içerisinde bir tane companion object tanımlanabilir. Companion object içerisindeki değişkenlere outer classtan veya main bloğunda nesne oluşturmadan class ismiyle ulaşılabilir fakat outer class içerisindeki property ve methodlara companion object içerisinden ulaşılamaz. Companion object için bir isim verebileceğimiz gibi isim vermeden de tanımlayabiliriz. Eğer Java classında kullanmak istiyorsak “@JvmStatic” annotation ile companion objecte isim vermeden ulaşılabilir(Bu annotation ile birlikte dilersek ismiyle de çağrım yapılabilir). Eğer hem annotation kullanılmamış hem de companion object bir isime sahip değilse çağrım esnasında isim yerine Companion yazılmalıdır.

Kotlin Companion Object
Java tarafından companion object çağrımı

Şimdiye kadar Kotlindeki temel konulardan bildiğim, öğrenebildiğim kadarıyla bahsettim.Hatalarım varsa geri dönüşlerinizi beklerim. :)

İyi çalışmalar. :)

--

--