Mobil geliştirmede Kotlin Özellikleri: nedir, hangi yapılar ve nasıl çalışır

Yazar: IT Sectr Yayınlanma: 2026-06-29 Okuma süresi: 11 dk

Kotlin, Android geliştirme için birincil dildir. Google Android Docs (2025)'a göre, yeni Android projelerinin %95'inden fazlası Kotlin kullanıyor. Kotlin özelliklerini anlamak — data class, sealed class, coroutines ve scope functions — bir Android geliştiricisi için zorunlu bir gerekliliktir.

Önemli Noktalar

  • data class — equals/hashCode/toString/copy/componentN otomatik oluşturma. Veri modelleri için. sealed class — when denetimi ile kısıtlı tip hiyerarşisi.
  • Scope functions: let, run, with, apply, also. Bağlama (it vs this) ve dönüş değerine göre ayrılır.
  • Coroutines: launch (fire-and-forget), async (sonuçlu), runBlocking (köprü), withContext (Dispatcher değişimi).
  • lifecycleScope ve viewModelScope — manuel iptal gerektirmeyen Lifecycle-aware coroutines.
  • reified — inline fonksiyonlarda tip koruma. lateinit/lazy — gecikmeli başlatma.

Sınıflar (data class, sealed class, object, companion object)

Kotlin, Java'daki sınıf kavramlarını genişletir. data class, sealed class, object ve companion object — Java'da bulunmayan veya farklı şekilde uygulanan yapılar.

data class vs sealed class

data class — equals(), hashCode(), toString(), copy() ve componentN()'i otomatik olarak oluşturan sınıf. Veri modelleri (DTO, Entity) için ideal. Gereksinimler: birincil kurucuda en az bir parametre, val/var, open/sealed/inner olamaz. sealed class — kısıtlı alt sınıf hiyerarşisine sahip sınıf. Tüm alt sınıflar derleme zamanında bilinir ve aynı dosyada bildirilir. sealed class ile when ifadesi else dalı gerektirmez. sealed interface (Kotlin 1.9+) — sealed class ile aynı ancak çoklu kalıtıma izin verir. object — singleton, object anahtar sözcüğüyle (class değil) bildirilir. Thread-safe geç başlatma. companion object — sınıfın statik üyeleri. Bir adı vardır (varsayılan olarak Companion). Arabirimleri uygulayabilir ve extension functions'a sahip olabilir.

Tip Açıklama Kullanım
data classequals, hashCode, toString, copy otomatik oluşturmaVeri modelleri, DTO, Entity
sealed classKısıtlı hiyerarşi, when denetimiDurumlar, Sonuç, UI State
sealed interfacesealed class + çoklu kalıtımOlaylar, Eylemler (Kotlin 1.9+)
objectSingleton (bildirimsel)Factory, Utility, Sabitler
companion objectSınıfın statik üyeleriFactory Method, statik sabitler
enum classSabitlerle numaralandırmaSabit kümeli durumlar

data class — modellerin %90'ı için. sealed class — UI State ve Sonuç için. object — singleton'lar için. IT Sectr, tüm ekran durumları (Loading, Success, Error) için sealed class önerir.

Pratikte Sealed class

Sealed class — durumları modellemek için güçlü bir araç. Örnek: UiState<T> alt sınıfları Loading, Success(data: T), Error(message: String) ile. when ifadesi tüm durumların işlenmesini garanti eder. Sealed interface — çoklu uygulama gereken olaylar ve eylemler için. Value class (Kotlin 1.5+) — overhead olmadan tek bir değer için sarmalayıcı. Tip-güvenli tanımlayıcılar için kullanılır: @JvmInline value class UserId(val id: String).

Fonksiyonlar (extension, inline, higher-order, scope functions)

Extension Function — kalıtım olmadan mevcut bir sınıfa yöntem ekleme. fun String.isEmail(): Boolean. Extension Property — özellikler için aynısı (backing field olmadan). Inline Function — fonksiyon gövdesini çağrı noktasına ekleme — çağrı overhead'i olmadan. Lambda ile higher-order fonksiyonlar için kullanılır. Higher-Order Function — başka bir fonksiyonu alan veya döndüren fonksiyon. Scope Functions — nesne bağlamıyla çalışmak için beş fonksiyon: let, run, with, apply, also.

Scope Functions

let — bağlam it, lambda sonucunu döndürür. Null-safe çağrılar için kullanılır (?.let {}). apply — bağlam this, bağlamı döndürür. Nesne yapılandırması için. run — bağlam this, lambda sonucunu döndürür. Bağlamla hesaplamalar için. also — bağlam it, bağlamı döndürür. Yan etkiler için (günlükleme). with — extension değil, bağlam this, lambda sonucunu döndürür. Bir nesne üzerinde işlem grubu için. Lambda — anonim fonksiyon. Destructuring Declaration — data class'ı değişkenlere ayırma: val (name, age) = person.

Inline + reified

Inline function ile reified — JVM'de genel tipi korumanın tek yolu. Kullanım: tip-güvenli builder'lar (Gson.fromJson<T>()), tip denetimi (is T), sınıfı alma (T::class). Crossinline ve Noinline — inline fonksiyonlarda lambda parametreleri için değiştiriciler. crossinline — non-local return'ü yasaklar, noinline — belirli bir lambda'nın inline edilmesini yasaklar. IT Sectr, yalnızca tiplerle çalışırken inline + reified önerir; normal higher-order fonksiyonlar için inline, bytecode boyutunu artırabilir.

Coroutines (Coroutine Builder, Dispatchers, Scope)

Coroutines — asenkron programlama için hafif iş parçacıkları. İş parçacığını bloke etmez — askıya alır (suspend). suspend function — iş parçacığını bloke etmeden askıya alınabilen fonksiyon. Yalnızca bir coroutine'den veya başka bir suspend function'dan çağrılabilir.

CoroutineScope

CoroutineScope — coroutine'ler için kapsam. CoroutineContext (Job + Dispatcher) içerir. lifecycleScope — Activity/Fragment için (Lifecycle-aware). viewModelScope — ViewModel için (onCleared()'da otomatik iptal). GlobalScope — genel kapsam (üretimde kullanmayın — bellek sızıntıları). Dispatchers: Dispatchers.Main (UI), Dispatchers.IO (ağ/disk), Dispatchers.Default (CPU-yoğun), Dispatchers.Unconfined (önerilmez). launch — coroutine başlatır: Job. async — sonuçla başlatır: Deferred<T>. runBlocking — bloke edici köprü. withContext — suspend fonksiyonu içinde Dispatcher değiştirir.

kotlin
// Coroutine örneği: ViewModel'de veri yükleme
class MainViewModel : ViewModel() {
    private val _state = MutableStateFlow<UiState>(UiState.Loading)
    val state: StateFlow<UiState> = _state.asStateFlow()

    fun loadData() {
        viewModelScope.launch {
            _state.value = UiState.Loading
            try {
                val data = withContext(Dispatchers.IO) {
                    repository.fetchData()
                }
                _state.value = UiState.Success(data)
            } catch (e: Exception) {
                _state.value = UiState.Error(e.message)
            }
        }
    }
}

// async ile paralel istekler
suspend fun loadCombinedData(): CombinedData = coroutineScope {
    val users = async(Dispatchers.IO) { api.getUsers() }
    val posts = async(Dispatchers.IO) { api.getPosts() }
    CombinedData(users.await(), posts.await())
}

viewModelScope.launch — ViewModel'de standart coroutine başlatma. withContext(Dispatchers.IO) — ağ isteği için IO iş parçacığına geçiş. Dispatchers, coroutine'in hangi iş parçacığı havuzunda yürütüleceğini belirler. IT Sectr, ViewModel için viewModelScope ve Activity/Fragment için lifecycleScope önerir.

Gelişmiş özellikler (reified, destructuring, lateinit/lazy)

reified — inline fonksiyonlarda tip değiştirici. Tipi kullanmaya izin verir: T::class, is T, as T. reified olmadan, JVM'de generics silinir (type erasure). inline fun + reified — tip-güvenli API'ler için güçlü bir kombinasyon. Destructuring Declaration — val (x, y) = point. data class ve componentN() içeren tipler için çalışır. typealias — tip takma adı: typealias Callback = (String) -> Unit. lateinit — var'ın gecikmeli başlatılması (dependency injection için). Thread-safe değil. lazy — val'in geç başlatılması (varsayılan olarak thread-safe). lazy(LazyThreadSafetyMode.NONE) — senkronizasyon olmadan. Extension function ve Extension property — kalıtım olmadan işlevsellik ekleme. Kotlin, extension functions'ın yardımcı işlemlerin %90'ını çözdüğü bir dildir.

Temsilci Özellikler

Delegated Properties — getter/setter'ı başka bir nesneye devretme. Standart temsilciler: lazy, observable, vetoable, map. getValue/setValue operatörleri aracılığıyla özel temsilci. by — temsilci anahtar sözcüğü: val name by lazy { loadName() }. Temsilci özellikler, ViewModel temsilcilerinin (by viewModels()) temelidir. IT Sectr, gecikmeli başlatma için lazy ve değişiklikleri gözlemlemek için Delegates.observable önerir.

Özellik Açıklama Örnek
reifiedInline'da genel tipi korumainline fun <reified T> parse(): T
destructuringData class'ı ayırmaval (name, age) = person
typealiasTip takma adıtypealias Orders = List<Order>
lateinitVar'ın gecikmeli başlatılmasılateinit var adapter: Adapter
lazyVal'in geç başlatılmasıval config by lazy { load() }
delegatedÖzellik temsilcisivar x by Delegates.observable(0)

reified — tip-güvenli API'ler için. lazy — gecikmeli yükleme için. delegated properties — özellik mantığını yeniden kullanmak için. IT Sectr, etkili Kotlin geliştirme için tüm bu özelliklerde ustalaşmayı önerir.

Flow ve StateFlow

Flow — Kotlin'de soğuk asenkron veri akışı. Toplayıcının talebi üzerine değerler yayar. StateFlow — tek bir geçerli değere sahip sıcak Flow. ViewModel'de UI State için kullanılır. SharedFlow — olaylar için sıcak Flow (tek seferlik olaylar). flowOf, asFlow — koleksiyonlardan Flow oluşturma. catch, retry, debounce — operatörler. stateIn, shareIn — soğuk Flow'u sıcağa dönüştürme. IT Sectr, UI State için StateFlow ve olaylar (Snackbar, navigasyon) için SharedFlow önerir.

kotlin
class SearchViewModel : ViewModel() {
    private val _query = MutableStateFlow("")
    val suggestions: StateFlow<List<String>> = _query
        .debounce(300)
        .filter { it.length >= 2 }
        .flatMapLatest { repository.search(it) }
        .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), emptyList())

    fun onQueryChanged(query: String) {
        _query.value = query
    }
}

Serileştirme (kotlinx.serialization, Parcelize)

kotlinx.serialization — JSON serileştirme için Kotlin kütüphanesi. @Serializable — ek açıklama. @SerialName — özel alan adı. Destekler: JSON, CBOR, ProtoBuf. Parcelize — Android Parcelable için @Parcelize (manuel uygulama olmadan). Gson vs Moshi vs kotlinx: kotlinx.serialization — Kotlin-first, derleme-güvenli, reflection olmadan. Moshi — ek açıklamalar + codegen. IT Sectr, yeni projeler için kotlinx.serialization ve mevcut projeler için Moshi önerir.

kotlin
@Serializable
data class ApiResponse<T>(
    val success: Boolean,
    @SerialName("data") val data: T? = null,
    val error: String? = null
)

@Serializable
data class User(
    val id: Int,
    val name: String,
    val email: String
)

// Seriden çıkarma
val json = Json { ignoreUnknownKeys = true }
val response = json.decodeFromString<ApiResponse<List<User>>>(jsonString)
println("Users: ${response.data?.size ?: 0}")

Sıkça Sorulan Sorular

data class ve sealed class arasındaki fark nedir?

data class — veri için (equals/hashCode/copy otomatik oluşturma). sealed class — tip hiyerarşisi için (when'de denetim). sealed interface — çoklu kalıtımla aynısı.

Kotlin'de scope functions nedir?

let, run, with, apply, also. Bağlama (it vs this) ve dönüş değerine (result vs context) göre ayrılır. let — null güvenliği, apply — yapılandırma, also — yan etkiler.

CoroutineScope nedir ve hangi türleri vardır?

CoroutineScope — coroutine'ler için kapsam. lifecycleScope — Activity için, viewModelScope — ViewModel için. GlobalScope — önerilmez.

Kotlin'de reified nedir?

reified — inline fonksiyonlarda tip koruma. T::class ve is T'ye izin verir. Yalnızca inline fonksiyonlarla çalışır.

Coroutine builder'lar nelerdir: launch, async, runBlocking?

launch — sonuçsuz. async — sonuçlu (Deferred). runBlocking — main/test için bloke edici köprü. withContext — Dispatcher değişimi.

Özet

  • data class — modeller için. sealed class — durumlar için. object — singleton'lar için.
  • Scope functions: let (null-güvenli), apply (yapılandırma), run (hesaplamalar), also (günlükleme).
  • Coroutines: launch (fire-and-forget), async (sonuçlu), withContext (Dispatcher değişimi).
  • viewModelScope — ViewModel için standart. lifecycleScope — Activity/Fragment için.
  • reified — tip-güvenli inline fonksiyonlar. lateinit — DI, lazy — geç başlatma.
  • Extension functions — kalıtım olmadan işlevsellik ekleyin.
  • Dispatchers: Main (UI), IO (ağ/disk), Default (CPU). Doğru olanı seçin.

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ış