Kotlin Android inkişafı üçün əsas dildir. Google Android Docs (2025)-ə görə, yeni Android layihələrinin 95%-dən çoxu Kotlin istifadə edir. Kotlin spesifikasını başa düşmək — data class, sealed class, koroutinlər və scope functions — Android tərtibatçısı üçün məcburi tələbdir.
Əsas Məqamlar
Kotlin Java-dan sinif anlayışlarını genişləndirir. data class, sealed class, object və companion object — Java-da olmayan və ya fərqli tətbiq olunan konstruksiyalar.
data class — equals(), hashCode(), toString(), copy() və componentN() avtomatik yaradan sinif. Data modelləri (DTO, Entity) üçün ideal. Tələblər: əsas konstruktorda ən azı bir parametr, val/var, open/sealed/inner ola bilməz. sealed class — məhdud alt sinif iyerarxiyası olan sinif. Bütün alt siniflər kompilə vaxtı məlumdur və eyni faylda elan edilir. sealed class ilə when ifadəsi else budağı tələb etmir. sealed interface (Kotlin 1.9+) — sealed class ilə eyni, lakin çoxlu mirasa icazə verir. object — sinqlton, object açar sözü ilə (class deyil) elan edilir. Thread-safe tənbəl başlatma. companion object — sinifin statik üzvləri. Adı var (standart Companion). İnterfeysləri tətbiq edə bilər və extension functions ola bilər.
| Tip | Təsvir | İstifadə |
|---|---|---|
| data class | equals, hashCode, toString, copy avtomatik yaradılması | Data modelləri, DTO, Entity |
| sealed class | Məhdud iyerarxiya, when yoxlaması | Vəziyyətlər, Nəticə, UI State |
| sealed interface | sealed class + çoxlu miras | Hadisələr, Hərəkətlər (Kotlin 1.9+) |
| object | Sinqlton (bəyannamə) | Factory, Utility, Sabitlər |
| companion object | Sinifin statik üzvləri | Factory Method, statik sabitlər |
| enum class | Sabitlərlə sadalama | Sabit dəstlə vəziyyətlər |
data class — 90% modellər üçün. sealed class — UI State və Nəticə üçün. object — sinqltonlar üçün. IT Sectr bütün ekran vəziyyətləri (Loading, Success, Error) üçün sealed class tövsiyə edir.
Sealed class — vəziyyətləri modelləşdirmək üçün güclü alət. Nümunə: UiState<T> alt sinifləri Loading, Success(data: T), Error(message: String) ilə. when ifadəsi bütün vəziyyətlərin işlənməsini təmin edir. Sealed interface — çoxlu tətbiq tələb olunan hadisələr və hərəkətlər üçün. Value class (Kotlin 1.5+) — overhead olmadan tək dəyər üçün sarğıcı. Tip-təhlükəsiz identifikatorlar üçün istifadə: @JvmInline value class UserId(val id: String).
Extension Function — miras olmadan mövcud sinifə metod əlavə etmək. fun String.isEmail(): Boolean. Extension Property — xassələr üçün eyni (backing field olmadan). Inline Function — funksiya gövdəsini çağrı yerinə yerləşdirmək — çağrı overheadi olmadan. Lambda ilə higher-order funksiyalar üçün istifadə. Higher-Order Function — başqa funksiyanı qəbul edən və ya qaytaran funksiya. Scope Functions — obyekt konteksti ilə işləmək üçün beş funksiya: let, run, with, apply, also.
let — kontekst it, lambda nəticəsini qaytarır. Null-safe çağrılar üçün istifadə (?.let {}). apply — kontekst this, konteksti qaytarır. Obyekt konfiqurasiyası üçün. run — kontekst this, lambda nəticəsini qaytarır. Kontekstlə hesablamalar üçün. also — kontekst it, konteksti qaytarır. Yan təsirlər üçün (loglama). with — extension deyil, kontekst this, lambda nəticəsini qaytarır. Obyekt üzərində əməliyyatlar qrupu üçün. Lambda — anonim funksiya. Destructuring Declaration — data class-ı dəyişənlərə ayırma: val (name, age) = person.
Inline function reified ilə — JVM-də generic tipi qorumağın yeganə yolu. İstifadə: tip-təhlükəsiz builderlər (Gson.fromJson<T>()), tip yoxlaması (is T), sinifi əldə etmək (T::class). Crossinline və Noinline — inline funksiyalarda lambda parametrləri üçün modificatorlar. crossinline — non-local return-ü qadağan edir, noinline — müəyyən lambdanın inliningini qadağan edir. IT Sectr yalnız tiplərlə işləyərkən inline + reified tövsiyə edir; adi higher-order funksiyalar üçün inline bayt kodun ölçüsünü artıra bilər.
Koroutinlər — asinxron proqramlaşdırma üçün yüngül ipliklər. İpliyi bloklamır — dayandırır (suspend). suspend function — ipliyi bloklamadan dayandırıla bilən funksiya. Yalnız koroutindən və ya başqa suspend funksiyadan çağrıla bilər.
CoroutineScope — koroutinlər üçün əhatə dairəsi. CoroutineContext (Job + Dispatcher) ehtiva edir. lifecycleScope — Activity/Fragment üçün (Lifecycle-aware). viewModelScope — ViewModel üçün (onCleared() da avtomatik ləğv). GlobalScope — qlobal əhatə dairəsi (produksiyada istifadə etməyin — yaddaş sızması). Dispatchers: Dispatchers.Main (UI), Dispatchers.IO (şəbəkə/disk), Dispatchers.Default (CPU-intensive), Dispatchers.Unconfined (tövsiyə edilmir). launch — koroutin başladır: Job. async — nəticə ilə başladır: Deferred<T>. runBlocking — bloklayan körpü. withContext — suspend funksiyası daxilində Dispatcher dəyişir.
// Koroutin nümunəsi: ViewModel-də məlumat yükləmə
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 ilə paralel sorğular
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-də standart koroutin başlatma. withContext(Dispatchers.IO) — şəbəkə sorğusu üçün IO ipliyinə keçid. Dispatchers koroutinin hansı iplik hovuzunda icra olunacağını müəyyən edir. IT Sectr ViewModel üçün viewModelScope və Activity/Fragment üçün lifecycleScope tövsiyə edir.
reified — inline funksiyalarda tip modificatoru. Tipi istifadə etməyə imkan verir: T::class, is T, as T. reified olmadan JVM-də generics silinir (type erasure). inline fun + reified — tip-təhlükəsiz API-lər üçün güclü birləşmə. Destructuring Declaration — val (x, y) = point. data class və componentN() olan tiplər üçün işləyir. typealias — tip təxəllüsü: typealias Callback = (String) -> Unit. lateinit — var-ın gecikmiş başlatması (dependency injection üçün). Thread-safe deyil. lazy — val-in tənbəl başlatması (standart olaraq thread-safe). lazy(LazyThreadSafetyMode.NONE) — sinxronizasiya olmadan. Extension function və Extension property — miras olmadan funksionallıq əlavə etmək. Kotlin extension functions-ın yardımçı tapşırıqların 90%-ni həll etdiyi bir dildir.
Delegated Properties — getter/setter-i başqa obyektə həvalə etmək. Standart delegatlar: lazy, observable, vetoable, map. getValue/setValue operatorları vasitəsilə xüsusi delegat. by — delegasiya açar sözü: val name by lazy { loadName() }. Delegə edilmiş xassələr ViewModel delegatlarının (by viewModels()) əsasıdır. IT Sectr gecikmiş başlatma üçün lazy və dəyişiklikləri müşahidə etmək üçün Delegates.observable tövsiyə edir.
| İmkan | Təsvir | Nümunə |
|---|---|---|
| reified | Inline-da generic tipi qoruma | inline fun <reified T> parse(): T |
| destructuring | Data class-ı ayırma | val (name, age) = person |
| typealias | Tip təxəllüsü | typealias Orders = List<Order> |
| lateinit | Var-ın gecikmiş başlatması | lateinit var adapter: Adapter |
| lazy | Val-in tənbəl başlatması | val config by lazy { load() } |
| delegated | Xassələrin delegasiyası | var x by Delegates.observable(0) |
reified — tip-təhlükəsiz API-lər üçün. lazy — gecikmiş yükləmə üçün. delegated properties — xassə məntiqini təkrar istifadə üçün. IT Sectr effektiv Kotlin inkişafı üçün bütün bu imkanları mənimsəməyi tövsiyə edir.
Flow — Kotlin-də soyuq asinxron məlumat axını. Kollektorun tələbi ilə dəyərlər buraxır. StateFlow — tək cari dəyəri olan isti Flow. ViewModel-də UI State üçün istifadə. SharedFlow — hadisələr üçün isti Flow (birdəfəlik hadisələr). flowOf, asFlow — kolleksiyalardan Flow yaratma. catch, retry, debounce — operatorlar. stateIn, shareIn — soyuq Flow-u istiyə çevirmə. IT Sectr UI State üçün StateFlow və hadisələr (Snackbar, naviqasiya) üçün SharedFlow tövsiyə edir.
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 serializasiyası üçün Kotlin kitabxanası. @Serializable — annotasiya. @SerialName — xüsusi sahə adı. Dəstəkləyir: JSON, CBOR, ProtoBuf. Parcelize — Android Parcelable üçün @Parcelize (əl ilə tətbiq olmadan). Gson vs Moshi vs kotlinx: kotlinx.serialization — Kotlin-first, kompilə-təhlükəsiz, reflection olmadan. Moshi — annotasiyalar + codegen. IT Sectr yeni layihələr üçün kotlinx.serialization və mövcud layihələr üçün Moshi tövsiyə edir.
@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
)
// Deserializasiya
val json = Json { ignoreUnknownKeys = true }
val response = json.decodeFromString<ApiResponse<List<User>>>(jsonString)
println("Users: ${response.data?.size ?: 0}")Tez-tez verilən suallar
data class — məlumat üçün (equals/hashCode/copy avtomatik yaradılması). sealed class — tip iyerarxiyası üçün (when-də yoxlama). sealed interface — çoxlu mirasla eyni.
let, run, with, apply, also. Kontekst (it vs this) və qaytarılan dəyər (result vs context) ilə fərqlənir. let — null təhlükəsizliyi, apply — konfiqurasiya, also — yan təsirlər.
CoroutineScope — koroutinlər üçün əhatə dairəsi. lifecycleScope — Activity üçün, viewModelScope — ViewModel üçün. GlobalScope — tövsiyə edilmir.
reified — inline funksiyalarda tipin qorunması. T::class və is T-ə icazə verir. Yalnız inline funksiyalarla işləyir.
launch — nəticəsiz. async — nəticə ilə (Deferred). runBlocking — main/test üçün bloklayan körpü. withContext — Dispatcher dəyişmək.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.