Kotlin'de object: sözdizimi ve singleton nesnelerin pratik kullanımı

Yazar: IT Sectr Yayınlanma: 2026-06-21 Okuma süresi: 9 dk

object Kotlin'de varsayılan olarak tembel başlatma ve iş parçacığı güvenliği ile bir singleton nesne oluşturmanın bildirimsel bir yoludur. object anahtar sözcüğü, tek bir örnekle tüm bir sınıfı değiştirir ve singleton, companion object, anonim nesneler ve statik yardımcı programlar bildirmek için kullanılır. JetBrains Kotlin Belgeleri'ne (2026) göre, object declaration JVM dünyasında bir singleton uygulamanın en basit ve en güvenli yoludur.

Önemli Noktalar

  • object — tek bir örnekle singleton sınıfı bildirmek için anahtar sözcük
  • Tembel başlatma — object sınıf yüklenirken değil, ilk erişimde oluşturulur
  • Companion object — Kotlin'de statik üyelerin benzeri (static anahtar sözcüğü yok)
  • Object expression — anında metotları geçersiz kılmak için anonim nesne
  • İş parçacığı güvenliği — object başlatması garantili thread-safe

Kotlin'de object nedir?

object Kotlin'de aynı anda bir sınıfı tanımlayan ve onun tek örneğini (singleton) oluşturan özel bir bildirim biçimidir. Tek bir yapıda sınıf bildirimi ve örnek oluşturmanın bir melezidir.

Java'da bir singleton oluşturmak için özel bir kurucu, statik bir alan, bir getInstance metodu ve iş parçacığı güvenliği işlemesi gerekir. Kotlin object bunu tek bir kod satırıyla yapar: object MySingleton { }. Derleyici, JVM bayt kodunda static initializer mekanizmasını kullanarak otomatik olarak iş parçacığı güvenli tembel başlatma oluşturur.

Kotlin Dil Belirtimi'ne (2026) göre, object declaration özel bir kurucu ve statik bir blokta başlatılan statik bir INSTANCE alanına sahip final bir sınıfa derlenir. Bu, JVM düzeyinde başlatma atomisitesini garanti eder.

Singleton nesneler (object declaration)

Object declaration (singleton nesne), object anahtar sözcüğünün ardından bir ad kullanılarak bildirilir. Nesne gövdesi özellikler, metotlar, init blokları içerebilir ve diğer sınıfları veya arayüzleri miras alabilir.

kotlin
object DatabaseManager {
    private val connection: String = "jdbc:postgresql://localhost:5432/app"
    
    fun query(sql: String): List<Map<String, Any>> {
        // sorgu yürütülüyor
        return emptyList()
    }
}

// Kullanım
DatabaseManager.query("SELECT * FROM users")

DatabaseManager'ın başlatılması ilk erişimde gerçekleşir — tembel ve iş parçacığı güvenli. Ek senkronizasyon kodu gerekmez.

object için kalıtım

Object normal sınıfları ve arayüzleri miras alabilir. Bu, tek bir örnekle soyut bir sınıf veya arayüzün uygulaması olarak object kullanılmasına olanak tanır.

kotlin
interface Logger {
    fun log(message: String)
}

object ConsoleLogger : Logger {
    override fun log(message: String) {
        println("[LOG] $message")
    }
}

Companion object

companion object, bir sınıfın içinde companion anahtar sözcüğüyle bildirilen özel bir object'tir. Kotlin'de static anahtar sözcüğü olmadığı için statik üyelerin yerini alır.

kotlin
class ApiClient {
    companion object {
        private const val BASE_URL = "https://api.example.com"
        
        fun create(): ApiClient {
            return ApiClient()
        }
    }
}

// ApiClient örneği oluşturmadan çağrı
val client = ApiClient.create()

Companion object bir ada sahip olabilir (varsayılan Companion), arayüzler uygulayabilir ve extension functions aracılığıyla genişletilebilir. Java'daki statik metotların aksine, companion object argüman olarak aktarılabilen veya bir değişkende saklanabilen tam teşekküllü bir nesnedir.

Kotlin En İyi Uygulamaları'na (2026) göre, companion object fabrika metotları, sabitler ve sınıfla ilgili statik yardımcı programlar için kullanılır. Companion object'in aşırı kullanımından kaçınılması önerilir — ilgisiz yardımcı programlar için üst düzey işlevler tercih edilir.

@JvmStatic ek açıklaması

Java uyumluluğu için, companion object metotları @JvmStatic ile ek açıklama alabilir. Bu, JVM bayt kodunda gerçek bir statik metot oluşturur ve Companion sözdizimi olmadan Java kodundan erişilebilir.

Object expressions (anonim nesneler)

Object expression, ayrı bir adlandırılmış sınıf bildirmeden bir sınıf veya arayüzün metotlarını geçersiz kılmak için anında oluşturulan anonim bir nesnedir.

kotlin
val handler = object : Runnable {
    override fun run() {
        println("Görev yürütüldü")
    }
}

thread(handler)

Object expressions, her yürütüldüklerinde yeni bir örnek oluşturmaları bakımından object bildirimlerinden farklıdır. Singleton değildirler ve adları yoktur. Anonim nesneler, tıpkı lambdalar gibi kapanışlarından değişken yakalayabilir.

Anonim sınıfların yalnızca bir türü miras alabildiği Java'nın aksine, Kotlin'in object expression'ı aynı anda birden çok türü miras alabilir.

kotlin
interface Clickable {
    fun click()
}

abstract class View {
    abstract fun render()
}

val button = object : View(), Clickable {
    override fun render() = println("Düğme işleniyor")
    override fun click() = println("Düğme tıklandı")
}

Pratik kullanım senaryoları

Object Kotlin'in en çok yönlü yapılarından biridir ve birçok senaryoda kullanılır.

Repository singleton'ları

Android projelerinde, birden çok örneğin gerekli olmadığı bir Repository bildirmek için object sıklıkla kullanılır. Tek bir örnek veri tutarlılığını sağlar.

kotlin
object UserRepository {
    fun getUser(id: Int): User? {
        // kullanıcı alınıyor
        return null
    }
}

companion object aracılığıyla fabrika metotları

Companion object ile fabrika metotları, birden çok kurucuya bir alternatiftir. Adlandırılmış fabrika metotları kodu kendi kendini belgeleyen hale getirir.

kotlin
data class GsonParser {
    companion object {
        fun create(): GsonParser = GsonParser()
        fun createPretty(): GsonParser = GsonParser()
    }
}

Sabitler ve numaralandırmalar

Object sabitler için bir kapsayıcı görevi görebilir ve Java'daki static final alanlarının yerini alabilir. Object kalıtımı destekler, bu da yapılandırma hiyerarşileri oluşturmaya olanak tanır.

Kotlin Standart Kütüphanesi'ne (2026) göre, object declaration Kotlin'de singleton oluşturmanın en verimli yoludur, double-checked locking uygulamalarını geride bırakır ve Java'daki enum singleton ile karşılaştırılabilir.

Sıkça Sorulan Sorular

object normal bir sınıftan nasıl farklıdır?

Object aynı anda bir sınıf bildirir ve onun tek örneğini oluşturur. Normal bir sınıf, bir kurucu aracılığıyla oluşturulan birden çok örneğe sahip olabilir.

Bir object declaration ne zaman başlatılır?

Tembel — nesneye ilk erişimde. O ana kadar bellek ayrılmaz ve init bloğundaki kod yürütülmez.

Bir object kurucuya sahip olabilir mi?

Hayır, object açık bir kurucuya sahip olamaz. Başlatma, nesneye ilk erişimde bir kez çağrılan init bloğunda gerçekleştirilir.

companion object normal bir object'ten nasıl farklıdır?

companion object, bir sınıfın içinde bildirilen bir object'tir. Üyelerine, bir örnek oluşturmadan sınıf adı aracılığıyla erişilebilir ve Java'nın statik üyelerinin yerini alır.

object declarations çok iş parçacıklı ortamda güvenli midir?

Evet, object başlatması JVM statik başlatıcısı sayesinde tamamen thread-safe'dir. Ek senkronizasyon gerekmez.

Özet

  • object — tembel ve iş parçacığı güvenli başlatma ile bildirimsel singleton
  • companion object — Kotlin'de statik üyeler, fabrika metotları, sabitler
  • Object expression — kapanıştan değişken yakalama ile anında anonim nesneler
  • Kalıtım — object, birden çok tür dahil sınıfları ve arayüzleri miras alabilir
  • Performans — JVM static initializer aracılığıyla başlatma, double-checked locking yükü yok
  • Kullanım — singleton hizmetleri, repository, sabitler, fabrikalar, dinleyici adaptörleri
  • Sınırlamalar — açık kurucu yok, JVM başına tek örnek

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun