Mobil inkişafda Kotlin spesifikası: bu nədir, hansı konstruksiyalar və necə işləyir

Müəllif: IT Sectr Dərc olunub: 2026-06-29 Oxuma vaxtı: 11 dəq

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

  • data class — equals/hashCode/toString/copy/componentN avtomatik yaradılması. Data modelləri üçün. sealed class — when yoxlaması ilə məhdud tip iyerarxiyası.
  • Scope functions: let, run, with, apply, also. Kontekst (it vs this) və qaytarılan dəyərə görə fərqlənir.
  • Koroutinlər: launch (fire-and-forget), async (nəticə ilə), runBlocking (körpü), withContext (Dispatcher dəyişmək).
  • lifecycleScopeviewModelScope — əl ilə ləğv etmədən Lifecycle-aware koroutinlər.
  • reified — inline funksiyalarda tipin qorunması. lateinit/lazy — gecikmiş başlatma.

Siniflər (data class, sealed class, object, companion object)

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 vs sealed class

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 classequals, hashCode, toString, copy avtomatik yaradılmasıData modelləri, DTO, Entity
sealed classMəhdud iyerarxiya, when yoxlamasıVəziyyətlər, Nəticə, UI State
sealed interfacesealed class + çoxlu mirasHadisələr, Hərəkətlər (Kotlin 1.9+)
objectSinqlton (bəyannamə)Factory, Utility, Sabitlər
companion objectSinifin statik üzvləriFactory Method, statik sabitlər
enum classSabitlərlə sadalamaSabit 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.

Praktikada Sealed class

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).

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

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.

Scope Functions

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 + reified

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 (Coroutine Builder, Dispatchers, Scope)

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

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.

kotlin
// 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.

Qabaqcıl imkanlar (reified, destructuring, lateinit/lazy)

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 functionExtension 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.

Delegə edilmiş xassələr

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ə
reifiedInline-da generic tipi qorumainline fun <reified T> parse(): T
destructuringData class-ı ayırmaval (name, age) = person
typealiasTip təxəllüsütypealias Orders = List<Order>
lateinitVar-ın gecikmiş başlatmasılateinit var adapter: Adapter
lazyVal-in tənbəl başlatmasıval config by lazy { load() }
delegatedXassə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 və StateFlow

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.

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
    }
}

Serializasiya (kotlinx.serialization, Parcelize)

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.

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
)

// 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 və sealed class arasında fərq nədir?

data class — məlumat üçün (equals/hashCode/copy avtomatik yaradılması). sealed class — tip iyerarxiyası üçün (when-də yoxlama). sealed interface — çoxlu mirasla eyni.

Kotlin-də scope functions nədir?

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 nədir və hansı növləri var?

CoroutineScope — koroutinlər üçün əhatə dairəsi. lifecycleScope — Activity üçün, viewModelScope — ViewModel üçün. GlobalScope — tövsiyə edilmir.

Kotlin-də reified nədir?

reified — inline funksiyalarda tipin qorunması. T::class və is T-ə icazə verir. Yalnız inline funksiyalarla işləyir.

Coroutine builder-lər nədir: launch, async, runBlocking?

launch — nəticəsiz. async — nəticə ilə (Deferred). runBlocking — main/test üçün bloklayan körpü. withContext — Dispatcher dəyişmək.

Xülasə

  • data class — modellər üçün. sealed class — vəziyyətlər üçün. object — sinqltonlar üçün.
  • Scope functions: let (null-təhlükəsiz), apply (konfiqurasiya), run (hesablamalar), also (loglama).
  • Koroutinlər: launch (fire-and-forget), async (nəticə ilə), withContext (Dispatcher dəyişmək).
  • viewModelScope — ViewModel üçün standart. lifecycleScope — Activity/Fragment üçün.
  • reified — tip-təhlükəsiz inline funksiyalar. lateinit — DI, lazy — tənbəl başlatma.
  • Extension functions — miras olmadan funksionallıq əlavə edin.
  • Dispatchers: Main (UI), IO (şəbəkə/disk), Default (CPU). Düzgününü seçin.

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.

Layihəni müzakirə et