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
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 — 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 class | equals, hashCode, toString, copy otomatik oluşturma | Veri modelleri, DTO, Entity |
| sealed class | Kısıtlı hiyerarşi, when denetimi | Durumlar, Sonuç, UI State |
| sealed interface | sealed class + çoklu kalıtım | Olaylar, Eylemler (Kotlin 1.9+) |
| object | Singleton (bildirimsel) | Factory, Utility, Sabitler |
| companion object | Sınıfın statik üyeleri | Factory Method, statik sabitler |
| enum class | Sabitlerle numaralandırma | Sabit 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.
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).
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.
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 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 — 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 — 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.
// 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.
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.
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 |
|---|---|---|
| reified | Inline'da genel tipi koruma | inline fun <reified T> parse(): T |
| destructuring | Data class'ı ayırma | val (name, age) = person |
| typealias | Tip takma adı | typealias Orders = List<Order> |
| lateinit | Var'ın gecikmeli başlatılması | lateinit var adapter: Adapter |
| lazy | Val'in geç başlatılması | val config by lazy { load() } |
| delegated | Özellik temsilcisi | var 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 — 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.
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
}
}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.
@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 — 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ı.
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 — coroutine'ler için kapsam. lifecycleScope — Activity için, viewModelScope — ViewModel için. GlobalScope — önerilmez.
reified — inline fonksiyonlarda tip koruma. T::class ve is T'ye izin verir. Yalnızca inline fonksiyonlarla çalışır.
launch — sonuçsuz. async — sonuçlu (Deferred). runBlocking — main/test için bloke edici köprü. withContext — Dispatcher değişimi.
Özet
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.