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 | مفرد (تصريحي) | Factory, Utility, الثوابت |
| companion object | أعضاء ثابتة في الفئة | Factory Method, ثوابت ثابتة |
| enum class | تعداد مع ثوابت | حالات بمجموعة ثابتة |
data class — لـ 90% من النماذج. sealed class — لـ UI State والنتيجة. object — للمفردات. IT Sectr توصي بـ sealed class لجميع حالات الشاشة (Loading, Success, Error).
Sealed class — أداة قوية لنمذجة الحالات. مثال: UiState<T> مع فئات فرعية Loading و Success(data: T) و Error(message: String). تعبير when يضمن معالجة جميع الحالات. Sealed interface — للأحداث (events) والإجراءات (actions) حيث نحتاج تنفيذاً متعدداً. 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 مع lambdas. Higher-Order Function — دالة تأخذ أو ترجع دالة أخرى. Scope Functions — خمس دوال للعمل مع سياق الكائن: let, run, with, apply, also.
let — السياق it، يرجع نتيجة lambda. يُستخدم للاستدعاءات الآمنة من null (?.let {}). apply — السياق this، يرجع السياق. لتكوين الكائن. run — السياق this، يرجع نتيجة lambda. للحسابات مع السياق. also — السياق it، يرجع السياق. للتأثيرات الجانبية (تسجيل). with — ليس extension، السياق this، يرجع نتيجة lambda. لمجموعة عمليات على كائن. Lambda — دالة مجهولة. Destructuring Declaration — تفكيك data class إلى متغيرات: val (name, age) = person.
Inline function مع reified — الطريقة الوحيدة للحفاظ على النوع العام في JVM. يُستخدم لـ: builders آمنة نوعياً (Gson.fromJson<T>())، التحقق من الأنواع (is T)، الحصول على الفئة (T::class). Crossinline و Noinline — معدّلات لمعاملات lambda في الدوال inline. crossinline — يمنع non-local return، noinline — يمنع تضمين lambda محددة. IT Sectr توصي بـ inline + reified فقط عند العمل مع الأنواع؛ للدوال higher-order العادية، قد يزيد inline من حجم bytecode.
Coroutines — خيوط خفيفة للبرمجة غير المتزامنة. لا تحجب الخيط — تتعطل (suspend). suspend function — دالة يمكن تعليقها دون حظر الخيط. يمكن استدعاؤها فقط من coroutine أو دالة suspend أخرى.
CoroutineScope — نطاق رؤية coroutines. يحتوي على 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. 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 (لـ dependency injection). غير آمن للخيوط. 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
)
// إلغاء التسلسل
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 — نطاق coroutines. lifecycleScope — لـ Activity، viewModelScope — لـ ViewModel. GlobalScope — غير موصى به.
reified — الحفاظ على النوع في الدوال inline. يسمح بـ T::class و is T. يعمل فقط مع الدوال inline.
launch — بدون نتيجة. async — مع نتيجة (Deferred). runBlocking — جسر حاجب لـ main/test. withContext — تغيير Dispatcher.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.