ویژگی‌های Kotlin در توسعه موبایل: چیست، چه ساختارهایی و چگونه کار می‌کند

نویسنده: IT Sectr منتشر شده: 2026-06-29 زمان مطالعه: 11 دقیقه

Kotlin زبان اصلی توسعه Android است. به گزارش Google Android Docs (2025)، بیش از 95% پروژه‌های جدید Android از Kotlin استفاده می‌کنند. درک ویژگی‌های Kotlin — data class، sealed class، coroutines و scope functions — یک الزام اجباری برای توسعه‌دهنده Android است.

نکات کلیدی

  • data class — تولید خودکار equals/hashCode/toString/copy/componentN. برای مدل‌های داده. sealed class — سلسله‌مراتب نوع محدود با بررسی when.
  • Scope functions: let, run, with, apply, also. بر اساس زمینه (it vs this) و مقدار بازگشتی متفاوت هستند.
  • Coroutines: launch (fire-and-forget)، async (با نتیجه)، runBlocking (پل)، withContext (تغییر Dispatcher).
  • lifecycleScope و viewModelScope — coroutines آگاه از چرخه حیات بدون لغو دستی.
  • reified — حفظ نوع در توابع inline. lateinit/lazy — مقداردهی اولیه تأخیری.

کلاس‌ها (data class, sealed class, object, companion object)

Kotlin مفاهیم کلاس را از Java گسترش می‌دهد. data class، sealed class، object و companion object — ساختارهایی که در Java وجود ندارند یا متفاوت پیاده‌سازی شده‌اند.

data class در مقابل sealed class

data class — کلاسی که به طور خودکار equals()، hashCode()، toString()، copy() و componentN() تولید می‌کند. ایده‌آل برای مدل‌های داده (DTO, Entity). الزامات: حداقل یک پارامتر در سازنده اصلی، val/var، نمی‌تواند open/sealed/inner باشد. sealed class — کلاسی با سلسله‌مراتب زیرکلاس محدود. همه زیرکلاس‌ها در زمان کامپایل مشخص هستند و در همان فایل اعلان می‌شوند. عبارت when با sealed class به شاخه else نیاز ندارد. sealed interface (Kotlin 1.9+) — مشابه sealed class اما اجازه وراثت چندگانه می‌دهد. object — singleton، با کلمه کلیدی object (نه class) اعلان می‌شود. مقداردهی اولیه تنبل ایمن نخ. companion object — اعضای ایستای کلاس. یک نام دارد (پیش‌فرض Companion). می‌تواند اینترفیس‌ها را پیاده‌سازی کند و extension functions داشته باشد.

نوع توضیحات کاربرد
data classتولید خودکار equals, hashCode, toString, copyمدل‌های داده, DTO, Entity
sealed classسلسله‌مراتب محدود، بررسی whenحالت‌ها, نتیجه, UI State
sealed interfacesealed class + وراثت چندگانهرویدادها, اقدامات (Kotlin 1.9+)
objectSingleton (اعلانی)Factory, Utility, ثابت‌ها
companion objectاعضای ایستای کلاسFactory Method, ثابت‌های ایستا
enum classشمارش با ثابت‌هاحالت‌های با مجموعه ثابت

data class — برای 90% مدل‌ها. sealed class — برای UI State و نتیجه. object — برای singleton‌ها. IT Sectr sealed class را برای همه حالت‌های صفحه (Loading, Success, Error) توصیه می‌کند.

Sealed class در عمل

Sealed class — ابزاری قدرتمند برای مدل‌سازی حالت‌ها. مثال: UiState<T> با زیرکلاس‌های Loading, Success(data: T), Error(message: String). عبارت when پردازش همه حالت‌ها را تضمین می‌کند. Sealed interface — برای رویدادها و اقداماتی که نیاز به پیاده‌سازی چندگانه دارند. Value class (Kotlin 1.5+) — لفافی برای یک مقدار واحد بدون overhead. برای شناسه‌های ایمن نوع استفاده می‌شود: @JvmInline value class UserId(val id: String).

توابع (extension, inline, higher-order, scope functions)

Extension Function — افزودن متد به کلاس موجود بدون وراثت. fun String.isEmail(): Boolean. Extension Property — همینطور برای ویژگی‌ها (بدون backing field). Inline Function — درج بدنه تابع در محل فراخوانی — بدون overhead فراخوانی. برای توابع higher-order با لامبدا استفاده می‌شود. Higher-Order Function — تابعی که تابع دیگر را می‌گیرد یا برمی‌گرداند. Scope Functions — پنج تابع برای کار با زمینه شیء: let, run, with, apply, also.

Scope Functions

let — زمینه it، نتیجه لامبدا را برمی‌گرداند. برای فراخوانی‌های null-safe استفاده می‌شود (?.let {}). apply — زمینه this، زمینه را برمی‌گرداند. برای پیکربندی شیء. run — زمینه this، نتیجه لامبدا را برمی‌گرداند. برای محاسبات با زمینه. also — زمینه it، زمینه را برمی‌گرداند. برای عوارض جانبی (ثبت). with — extension نیست، زمینه this، نتیجه لامبدا را برمی‌گرداند. برای گروهی از عملیات روی یک شیء. Lambda — تابع ناشناس. Destructuring Declaration — تجزیه data class به متغیرها: val (name, age) = person.

Inline + reified

Inline function با reified — تنها راه حفظ نوع جنریک در JVM. استفاده برای: builderهای ایمن نوع (Gson.fromJson<T>())، بررسی نوع (is T)، دریافت کلاس (T::class). Crossinline و Noinline — تغییردهنده‌های پارامترهای لامبدا در توابع inline. crossinline — non-local return را ممنوع می‌کند، noinline — inline کردن لامبدای خاص را ممنوع می‌کند. IT Sectr inline + reified را فقط هنگام کار با انواع توصیه می‌کند؛ برای توابع higher-order معمولی، inline می‌تواند اندازه بایت‌کد را افزایش دهد.

Coroutines (Coroutine Builder, Dispatchers, Scope)

Coroutines — نخ‌های سبک برای برنامه‌نویسی ناهمگام. نخ را مسدود نمی‌کنند — معلق می‌شوند (suspend). suspend function — تابعی که می‌تواند بدون مسدود کردن نخ معلق شود. فقط از یک coroutine یا تابع suspend دیگر قابل فراخوانی است.

CoroutineScope

CoroutineScope — محدوده coroutine‌ها. شامل CoroutineContext (Job + Dispatcher). lifecycleScope — برای Activity/Fragment (آگاه از چرخه حیات). viewModelScope — برای ViewModel (لغو خودکار در onCleared()). GlobalScope — محدوده سراسری (در تولید استفاده نکنید — نشت حافظه). Dispatchers: Dispatchers.Main (UI), Dispatchers.IO (شبکه/دیسک), Dispatchers.Default (CPU-intensive), Dispatchers.Unconfined (توصیه نمی‌شود). launch — شروع coroutine: Job. async — شروع با نتیجه: Deferred<T>. runBlocking — پل مسدودکننده. withContext — تغییر Dispatcher درون تابع suspend.

kotlin
// مثال coroutines: بارگذاری داده در ViewModel
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
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 — شروع استاندارد coroutine در ViewModel. withContext(Dispatchers.IO) — تغییر به نخ IO برای درخواست شبکه. Dispatchers تعیین می‌کنند coroutine روی کدام نخ‌pool اجرا می‌شود. IT Sectr viewModelScope را برای ViewModel و lifecycleScope را برای Activity/Fragment توصیه می‌کند.

قابلیت‌های پیشرفته (reified, destructuring, lateinit/lazy)

reified — تغییردهنده نوع در توابع inline. امکان استفاده از نوع را می‌دهد: T::class, is T, as T. بدون reified، جنریک‌ها در JVM پاک می‌شوند (type erasure). inline fun + reified — ترکیبی قدرتمند برای APIهای ایمن نوع. Destructuring Declaration — val (x, y) = point. برای data class و انواع دارای componentN() کار می‌کند. typealias — نام مستعار نوع: typealias Callback = (String) -> Unit. lateinit — مقداردهی اولیه تأخیری var (برای تزریق وابستگی). ایمن نخ نیست. lazy — مقداردهی اولیه تنبل val (پیش‌فرض ایمن نخ). lazy(LazyThreadSafetyMode.NONE) — بدون همگام‌سازی. Extension function و Extension property — افزودن قابلیت بدون وراثت. Kotlin زبانی است که در آن extension functions 90% کارهای ابزاری را حل می‌کنند.

ویژگی‌های تفویض‌شده

Delegated Properties — تفویض getter/setter به شیء دیگر. تفویض‌کننده‌های استاندارد: lazy, observable, vetoable, map. تفویض‌کننده سفارشی از طریق عملگرهای getValue/setValue. by — کلمه کلیدی تفویض: val name by lazy { loadName() }. ویژگی‌های تفویض‌شده پایه تفویض‌کننده‌های ViewModel (by viewModels()) هستند. IT Sectr lazy را برای مقداردهی اولیه تأخیری و Delegates.observable را برای مشاهده تغییرات توصیه می‌کند.

قابلیت توضیحات مثال
reifiedحفظ نوع جنریک در inlineinline fun <reified T> parse(): T
destructuringتجزیه data classval (name, age) = person
typealiasنام مستعار نوعtypealias Orders = List<Order>
lateinitمقداردهی اولیه تأخیری varlateinit var adapter: Adapter
lazyمقداردهی اولیه تنبل valval config by lazy { load() }
delegatedتفویض ویژگی‌هاvar x by Delegates.observable(0)

reified — برای APIهای ایمن نوع. lazy — برای بارگذاری تأخیری. delegated properties — برای استفاده مجدد از منطق ویژگی‌ها. IT Sectr تسلط بر تمام این قابلیت‌ها را برای توسعه مؤثر Kotlin توصیه می‌کند.

Flow و StateFlow

Flow — جریان داده ناهمگام سرد در Kotlin. مقادیر را بنا به درخواست جمع‌آوری‌کننده منتشر می‌کند. StateFlow — Flow گرم با یک مقدار جاری واحد. در ViewModel برای UI State استفاده می‌شود. SharedFlow — Flow گرم برای رویدادها (رویدادهای یک‌باره). flowOf, asFlow — ایجاد Flow از مجموعه‌ها. catch, retry, debounce — عملگرها. stateIn, shareIn — تبدیل Flow سرد به گرم. IT Sectr StateFlow را برای UI State و SharedFlow را برای رویدادها (Snackbar, ناوبری) توصیه می‌کند.

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

سریال‌سازی (kotlinx.serialization, Parcelize)

kotlinx.serialization — کتابخانه Kotlin برای سریال‌سازی JSON. @Serializable — حاشیه‌نویسی. @SerialName — نام فیلد سفارشی. پشتیبانی: JSON, CBOR, ProtoBuf. Parcelize — @Parcelize برای Android Parcelable (بدون پیاده‌سازی دستی). Gson vs Moshi vs kotlinx: kotlinx.serialization — Kotlin-first, ایمن در کامپایل, بدون reflection. Moshi — حاشیه‌نویسی + codegen. IT Sectr kotlinx.serialization را برای پروژه‌های جدید و Moshi را برای پروژه‌های موجود توصیه می‌کند.

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
)

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

سوالات متداول

تفاوت بین data class و sealed class چیست؟

data class — برای داده (تولید خودکار equals/hashCode/copy). sealed class — برای سلسله‌مراتب نوع (بررسی در when). sealed interface — همان با وراثت چندگانه.

scope functions در Kotlin چیست؟

let, run, with, apply, also. بر اساس زمینه (it vs this) و مقدار بازگشتی (result vs context) متفاوت. let — ایمنی null, apply — پیکربندی, also — عوارض جانبی.

CoroutineScope چیست و چه انواعی دارد؟

CoroutineScope — محدوده coroutine‌ها. lifecycleScope — برای Activity, viewModelScope — برای ViewModel. GlobalScope — توصیه نمی‌شود.

reified در Kotlin چیست؟

reified — حفظ نوع در توابع inline. امکان T::class و is T. فقط با توابع inline کار می‌کند.

coroutine builderها چیست: launch, async, runBlocking؟

launch — بدون نتیجه. async — با نتیجه (Deferred). runBlocking — پل مسدودکننده برای main/test. withContext — تغییر Dispatcher.

خلاصه

  • data class — برای مدل‌ها. sealed class — برای حالت‌ها. object — برای singleton‌ها.
  • Scope functions: let (ایمن null), apply (پیکربندی), run (محاسبات), also (ثبت).
  • Coroutines: launch (fire-and-forget), async (با نتیجه), withContext (تغییر Dispatcher).
  • viewModelScope — استاندارد برای ViewModel. lifecycleScope — برای Activity/Fragment.
  • reified — توابع inline ایمن نوع. lateinit — DI, lazy — مقداردهی اولیه تنبل.
  • Extension functions — بدون وراثت قابلیت اضافه کنید.
  • Dispatchers: Main (UI), IO (شبکه/دیسک), Default (CPU). صحیح را انتخاب کنید.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه