Kotlin هي لغة برمجة مكتوبة بشكل ثابت من JetBrains، تعمل على JVM ومدعومة رسمياً من Google لتطوير Android منذ 2017. Kotlin متوافقة تماماً مع Java، ولها بناء جملة موجز وأمان فارغ مدمج. Kotlin Documentation — دليل كامل للغة والمكتبة القياسية.
النقاط الرئيسية
Kotlin هي لغة برمجة مكتوبة بشكل ثابت تم إنشاؤها بواسطة JetBrains (مطور IntelliJ IDEA) وتم إصدارها في 2016 بموجب ترخيص Apache 2.0. يتم ترجمة Kotlin إلى bytecode JVM و JavaScript وكود أصلي (عبر Kotlin/Native). مجالات تطبيقها الرئيسية هي تطوير Android وتطبيقات الخادم والمشاريع عبر المنصات.
أعلنت Google أن Kotlin هي اللغة الرسمية لتطوير Android في Google I/O 2017. وفقاً لـ Google (مدونة Android Developer, 2026)، أكثر من 85% من المشاريع الجديدة على Google Play تستخدم Kotlin. تُستخدم اللغة أيضاً بنشاط في تطوير الخادم (Spring Boot, Ktor) والمشاريع متعددة المنصات (Kotlin Multiplatform Mobile).
Kotlin متوافقة تماماً مع Java — يمكنك استدعاء كود Java من Kotlin والعكس داخل نفس المشروع. تدعم أدوات البناء (Gradle, Maven) كلتا اللغتين، مما يسمح بالهجرة التدريجية من Java إلى Kotlin دون توقف في التطوير.
الأسباب الرئيسية: الإيجاز — تتطلب Kotlin في المتوسط 40% أسطر كود أقل من Java لنفس المهمة. الأمان الفارغ — يمنع المترجم استخدام الأنواع nullable بدون فحص. الإمكانيات الوظيفية — دوال الترتيب الأعلى، lambdas، extension functions والـ coroutines تجعل الكود أكثر تعبيراً وأماناً.
بناء جملة Kotlin الأساسي يجمع بين الإيجاز والوضوح. تُعلن المتغيرات عبر val (غير قابل للتغيير) و var (قابل للتغيير). يستخدم المترجم استدلال الأنواع، ولكن الإعلان الصريح للنوع مدعوم. تُعلن الدوال بالكلمة المفتاحية fun.
package com.example.intro
// الثوابت والمتغيرات
val appName: String = "KotlinApp" // غير قابل للتغيير
var version = 1.0 // قابل للتغيير، النوع مستنتج
// دالة مع expression body
fun sum(a: Int, b: Int) = a + b
// String templates
fun greet(name: String) = "مرحباً، $name! الإصدار ${appName}_$version"
// Default and named arguments
fun createUser(
name: String,
age: Int = 18,
email: String? = null
)تعبير when يحل محل switch في Java وهو أكثر مرونة: يدعم فحص الأنواع والنطاقات والشروط والفروع بدون break. يتحقق المترجم من التغطية الشاملة للـ enum و sealed classes. التحويلات الذكية تحوّل الأنواع تلقائياً بعد فحص is، مما يلغي الحاجة إلى التحويلات الصريحة.
fun analyzeValue(value: Any) = when (value) {
is String -> "سلسلة طولها ${value.length}" // تحويل ذكي
is Int -> "عدد صحيح: $value"
in 1..10 -> "رقم في النطاق 1-10"
else -> "نوع غير معروف"
}الأمان الفارغ هو ميزة رئيسية في Kotlin تلغي NullPointerException في وقت الترجمة. في Kotlin، لا يمكن أن تكون الأنواع null بشكل افتراضي. للسماح بـ null، أضف ? إلى النوع: String?. يطلب المترجم فحصاً صريحاً لكل قيمة nullable.
// أنواع nullable و non-null
val nonNull: String = "دائماً غير null"
val nullable: String? = null // مسموح
// Safe call — ينفذ فقط إذا لم يكن null
val length: Int? = nullable?.length
// عامل Elvis — قيمة افتراضية
val text: String = nullable ?: "Default text"
// Let — تنفيذ كتلة بقيمة non-null
nullable?.let { value ->
println("القيمة: $value")
}عامل الاستدعاء الآمن (?.) يُرجع null إذا كان الكائن قبل العامل هو null، ويستدعي الدالة/الخاصية في الحالة المعاكسة. عامل Elvis (?:) يوفر قيمة افتراضية إذا كان الجانب الأيسر null. تأكيد non-null (!!) يلقي NullPointerException إذا كانت القيمة null — استخدمه فقط عندما تكون متأكداً 100% من وجود القيمة.
الأنواع platform — أنواع Java من كود Java المستدعى التي لا يمكن لـ Kotlin تمييزها كـ nullable أو non-null. يظهر النوع كـ String! (مع علامة تعجب). المطور مسؤول عن الأمان الفارغ عند العمل مع كود Java.
فئات البيانات في Kotlin تولد تلقائياً equals() و hashCode() و toString() و copy() و componentN(). هذا يلغي النمط المتكرر لنماذج Java (POJO) ويجعل الكود أنظف. إعلان data class يستغرق سطراً واحداً بدلاً من 20-30 في Java.
data class User(
val id: Long,
val name: String,
val email: String,
val age: Int? = null
)
// استخدام
val user = User(1, "آنا", "anna@example.com")
val updatedUser = user.copy(age = 25)
// تفكيك
val (id, name) = user
println("المستخدم #$id: $name")التفكيك يسمح بتفكيك data class إلى متغيرات في سطر واحد. هذا مناسب عند العمل مع أزواج وثلاثيات وقيم مركبة أخرى. التفكيك مدعوم لفئات البيانات والمجموعات القياسية (List, Map) وأي فئة تحتوي على operator fun componentN().
دوال الإضافة هي آلية في Kotlin لإضافة دوال جديدة إلى الفئات الموجودة دون وراثة. يتم ترجمة الإضافات إلى دوال ثابتة مع معامل مستقبل، لذلك ليست هناك حاجة للوراثة ولا يتم دعم الإرسال الافتراضي.
// دالة إضافة لـ String
fun String.isEmail(): Boolean {
return this.contains("@") && this.contains(".")
}
// خاصية إضافة
val String.isPhoneNumber: Boolean
get() = this.matches(Regex("^\\+?[\\d-]{10,15}$"))
// إضافة عامة للمجموعات
fun List<Int>.sumOfEvens(): Int {
return this.filter { it % 2 == 0 }.sum()
}
// استخدام
println("test@mail.com".isEmail()) // trueتُستخدم الإضافات على نطاق واسع في Android SDK والمكتبات. على سبيل المثال، إضافات Activity في Android KTX هي extension functions لـ Activity و Fragment و View وفئات أخرى. يمكن إعلان الإضافات كدوال عالية المستوى في ملف أو كأعضاء في فئة.
الروتينات المتزامنة هي آلية برمجة غير متزامنة في Kotlin تسمح بكتابة كود غير محجوب بأسلوب تسلسلي. يوقف الروتين المتزامن تنفيذه عند دالة suspend دون حجب الخيط ويستأنف بعد اكتمال العملية. هذا بديل لسلاسل استرجاع RxJava و AsyncTask.
import kotlinx.coroutines.*
// دالة suspend — يمكن إيقافها
suspend fun fetchUserData(userId: Int): User {
// delay — دالة suspend، لا تحجب الخيط
delay(500)
return User(userId, "User $userId", "user@example.com")
}
// تشغيل في روتين متزامن
fun loadData() {
CoroutineScope(Dispatchers.Main).launch {
val user = fetchUserData(1) // إيقاف هنا
updateUI(user) // استمرار على الخيط الرئيسي
}
}Dispatchers تحدد مجموعة الخيوط للروتين المتزامن: Dispatchers.Main (خيط واجهة المستخدم)، Dispatchers.IO (عمليات الشبكة/القرص)، Dispatchers.Default (مهام كثيفة المعالجة). التزامن المنظم يضمن أن الروتين المتزامن لا يبقى نشطاً بعد اكتمال النطاق — هذا يمنع تسرب الذاكرة.
// تنفيذ متوازٍ عبر async/await
suspend fun loadDashboard(): Dashboard = coroutineScope {
val user = async { fetchUserData(1) }
val orders = async { fetchOrders(1) }
val stats = async { fetchStats() }
Dashboard(user.await(), orders.await(), stats.await())
}الاختيار بين Kotlin و Java لمشروع Android جديد هو قرار معماري أساسي. تقدم Kotlin بناء جملة أكثر حداثة وآليات أمان مدمجة، بينما تمتلك Java مجموعة أوسع من المطورين ومكتبات ناضجة.
| الخاصية | Kotlin | Java |
|---|---|---|
| الأمان الفارغ | مدمج (nullable/non-null) | غير مدمج (تعليقات @Nullable) |
| حجم الكود | −40% مقارنة بـ Java | كود متكرر (getters/setters) |
| فئات البيانات | data class (سطر واحد) | POJO مع Lombok أو يدوياً |
| عدم التزامن | Coroutines (suspend/await) | CompletableFuture, RxJava |
| دوال الإضافة | مدمجة | فقط عبر فئات مساعدة |
| التحويلات الذكية | بعد فحص is | تحويل صريح (Type) obj |
| التوافق العكسي | 100% مع Java | — |
الأداء لـ Kotlin و Java قابل للمقارنة — كلاهما يُترجم إلى bytecode JVM. تضيف Kotlin أحياناً حملاً صغيراً إضافياً للـ coroutines و inlining، لكنه غير مهم لتطبيقات الهاتف المحمول. تستثمر Google و JetBrains بنشاط في Kotlin: Kotlin Multiplatform و Kotlin/Wasm وتحسينات أداء المترجم K2.
الأسئلة الشائعة
Kotlin أقصر من Java بنسبة 40% — كود متكرر أقل. تضيف Kotlin الأمان الفارغ، فئات البيانات، دوال الإضافة، الروتينات المتزامنة، التحويلات الذكية، تعبيرات when. توافق كامل مع Java: كلتا اللغتين تعملان على JVM ويمكن استخدامهما في نفس المشروع دون تعارض.
الأنواع تكون non-null بشكل افتراضي. للأنواع nullable استخدم ?: String?. يمنع المترجم الوصول المباشر للقيم nullable. Safe call (?.) يُرجع null عند مستقبل null. عامل Elvis (?:) يحدد قيمة افتراضية. !! — استخراج إجباري مع استثناء محتمل.
الروتينات المتزامنة هي خيوط خفيفة تسمح بكتابة كود غير متزامن بشكل تسلسلي. دوال suspend تتوقف دون حجب الخيط. launch و async يشغلان الروتينات المتزامنة في CoroutineScope. Dispatchers.IO لطلبات الشبكة، Dispatchers.Main لتحديثات واجهة المستخدم.
data class تولد تلقائياً equals(), hashCode(), toString(), copy() و componentN(). مثال: data class User(val name: String, val age: Int). التفكيك عبر val (name, age) = user. مشابه لـ record في Java 14+، ولكن مع دالة copy() إضافية.
دوال الإضافة تضيف دوالاً إلى الفئات الموجودة: fun String.isEmail(): Boolean. يستبدلها المترجم باستدعاءات ثابتة مع معامل مستقبل. لا حاجة للوراثة. تُستخدم الإضافات على نطاق واسع في Android KTX: view.showToast(), activity.viewModels().
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.