C# ve java programlama dillerinde daha önceden ilgilenen arkadaşlar varsa mutlaka “static” anahtar kelimesini duymuştur. Bu static anahtar kelimesi Kotlin programlama dilinde object olarak kullanılmaktadır. Peki, nedir bu object?

Object Anahtar kelimesi, sınıftan sadece bir nesne yaratılmasını sağlar. Örneğin a ve b referanslarına sahip iki nesne üretsek bile arkaplanda sadece ilk nesne olan a nesnesi üretilir ve b referansı üzerinde ulaştığımız nesne de a nesnesinin kendisidir. Yani, bir a nesnesi tanımlayıp, başka olarak b nesnesi de tanımladığımızda ikisi de aynı nesneler olup referansları farklı olur.

object obj
{
    var sayi : Int = 0
    
    fun sayiyiYaz()
    {
        println(sayi)
    }
}

fun main(args: Array<String>)
{
    var o1 : obj = obj
    o1.sayi = 5
    o1.sayiyiYaz()
    
    var o2 : obj = obj
    o2.sayi = 22
    o2.sayiyiYaz()
}


Burada görüldüğü üzere obj objesinden o1 ve o2 nesnesi ürettim ve ayrı sayılara eşitleyip ayrı yazdırdım. Uygulama
5
22
çıktısını verecektir. Burada dikkat edilmelidir ki farklı nesneler üretsek bile bunlar aynı nesnelerdir. 

object obj
{
    var sayi : Int = 0
    
    fun sayiyiYaz()
    {
        println(sayi)
    }
}

fun main(args: Array<String>)
{
    var o1 : obj = obj
    o1.sayi = 5
    o1.sayiyiYaz()
    
    var o2 : obj = obj
    o2.sayi = 22
    
    o1.sayiyiYaz()
    o2.sayiyiYaz()
}


o1.sayiyiYaz() metodunu tekrardan çağırdım ve bu kez uygulama
5
22
22 
çıktısını verdi. Yani, özet olarak o1 ve o2 aynı nesneler sadece referans noktaları farklıdır. Şimdi gelelim companion object kavramına. Companion object, java ve C#’daki static kelimesinin karşılığıdır. 

class KullaniciKayit(var id:Int, var isim:String)
{
   var kullaniciSayisi = 0
   
    init
    {
        kullaniciSayisi++
    }
    
    fun BilgileriGoster()
    {
        println("id: $id, isim: $isim, Kullanıcı Sayısı: $kullaniciSayisi")
    }
    
}


fun main(args: Array<String>)
{
    var kullanici1 : KullaniciKayit = KullaniciKayit(1, "Barış")
    kullanici1.BilgileriGoster()
    
    var kullanici2 : KullaniciKayit = KullaniciKayit(2, "Yunus")
    kullanici2.BilgileriGoster()
    
    var kullanici3 : KullaniciKayit = KullaniciKayit(3, "Andrei")
    kullanici3.BilgileriGoster()
}






Yukarıdaki örnekte, consturctor metodu olan KullaniciKayit() sınıfına elemanlarını gönderdik. Ancak, dikkat edilirse, sınıfımız her nesne üretilip yeniden çağırıldığında kullaniciSayisi adlı değişken her zaman sıfır olup, init bloğunda sadece 1 kez artacaktır. Yani şuanda uygulamamızın çıktısı aşağıdaki gibidir.

id: 1, isim: Barış, Kullanıcı Sayısı: 1
id: 2, isim: Yunus, Kullanıcı Sayısı: 1
id: 3, isim: Andrei, Kullanıcı Sayısı: 1

Biz, burada kullanıcı sayısının her kullanıcı kayıt edilişinde artmasını istiyoruz. İşte burada, companion object kavramı devreye girmektedir.

class KullaniciKayit(var id:Int, var isim:String)
{
   companion object
    {
        var kullaniciSayisi = 0
    }
   
   
    init
    {
        kullaniciSayisi++
    }
    
    fun BilgileriGoster()
    {
        println("id: $id, isim: $isim, Kullanıcı Sayısı: $kullaniciSayisi")
    }
    
}


fun main(args: Array<String>)
{
    var kullanici1 : KullaniciKayit = KullaniciKayit(1, "Barış")
    kullanici1.BilgileriGoster()
    
    var kullanici2 : KullaniciKayit = KullaniciKayit(2, "Yunus")
    kullanici2.BilgileriGoster()
    
    var kullanici3 : KullaniciKayit = KullaniciKayit(3, "Andrei")
    kullanici3.BilgileriGoster()
}


Yukarıdaki gibi, kullaniciSayisi değişkenimizi companion object olarak tanımladığımızda bunu statik olarak tanımlamış oluruz ve her nesne üretildiğinde değişken bir önceki değerini korumuş olur. Yani burada kullaniciSayisi adlı değişkenimiz bir nesne değil, sınıf değişkeni olmuş oldu.