Kotlin زبان اصلی توسعه Android است. به گزارش Google Android Docs (2025)، بیش از 95% پروژههای جدید Android از Kotlin استفاده میکنند. درک ویژگیهای Kotlin — data class، sealed class، coroutines و scope functions — یک الزام اجباری برای توسعهدهنده Android است.
نکات کلیدی
Kotlin مفاهیم کلاس را از Java گسترش میدهد. data class، sealed class، object و companion object — ساختارهایی که در Java وجود ندارند یا متفاوت پیادهسازی شدهاند.
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 interface | sealed class + وراثت چندگانه | رویدادها, اقدامات (Kotlin 1.9+) |
| object | Singleton (اعلانی) | 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 — ابزاری قدرتمند برای مدلسازی حالتها. مثال: 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 Function — افزودن متد به کلاس موجود بدون وراثت. fun String.isEmail(): Boolean. Extension Property — همینطور برای ویژگیها (بدون backing field). Inline Function — درج بدنه تابع در محل فراخوانی — بدون overhead فراخوانی. برای توابع higher-order با لامبدا استفاده میشود. Higher-Order Function — تابعی که تابع دیگر را میگیرد یا برمیگرداند. Scope Functions — پنج تابع برای کار با زمینه شیء: let, run, with, apply, also.
let — زمینه it، نتیجه لامبدا را برمیگرداند. برای فراخوانیهای null-safe استفاده میشود (?.let {}). apply — زمینه this، زمینه را برمیگرداند. برای پیکربندی شیء. run — زمینه this، نتیجه لامبدا را برمیگرداند. برای محاسبات با زمینه. also — زمینه it، زمینه را برمیگرداند. برای عوارض جانبی (ثبت). with — extension نیست، زمینه this، نتیجه لامبدا را برمیگرداند. برای گروهی از عملیات روی یک شیء. Lambda — تابع ناشناس. Destructuring Declaration — تجزیه data class به متغیرها: val (name, age) = person.
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 — نخهای سبک برای برنامهنویسی ناهمگام. نخ را مسدود نمیکنند — معلق میشوند (suspend). suspend function — تابعی که میتواند بدون مسدود کردن نخ معلق شود. فقط از یک coroutine یا تابع suspend دیگر قابل فراخوانی است.
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.
// مثال 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 — تغییردهنده نوع در توابع 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 | حفظ نوع جنریک در inline | inline fun <reified T> parse(): T |
| destructuring | تجزیه data class | val (name, age) = person |
| typealias | نام مستعار نوع | typealias Orders = List<Order> |
| lateinit | مقداردهی اولیه تأخیری var | lateinit var adapter: Adapter |
| lazy | مقداردهی اولیه تنبل val | val config by lazy { load() } |
| delegated | تفویض ویژگیها | var x by Delegates.observable(0) |
reified — برای APIهای ایمن نوع. lazy — برای بارگذاری تأخیری. delegated properties — برای استفاده مجدد از منطق ویژگیها. IT Sectr تسلط بر تمام این قابلیتها را برای توسعه مؤثر Kotlin توصیه میکند.
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, ناوبری) توصیه میکند.
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 — کتابخانه 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 را برای پروژههای موجود توصیه میکند.
@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 — برای داده (تولید خودکار equals/hashCode/copy). sealed class — برای سلسلهمراتب نوع (بررسی در when). sealed interface — همان با وراثت چندگانه.
let, run, with, apply, also. بر اساس زمینه (it vs this) و مقدار بازگشتی (result vs context) متفاوت. let — ایمنی null, apply — پیکربندی, also — عوارض جانبی.
CoroutineScope — محدوده coroutineها. lifecycleScope — برای Activity, viewModelScope — برای ViewModel. GlobalScope — توصیه نمیشود.
reified — حفظ نوع در توابع inline. امکان T::class و is T. فقط با توابع inline کار میکند.
launch — بدون نتیجه. async — با نتیجه (Deferred). runBlocking — پل مسدودکننده برای main/test. withContext — تغییر Dispatcher.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.