كيف تجتاز مقابلة Kotlin: أفضل الأسئلة من الألف إلى الياء
\n\nمقابلة Kotlin ليست مجرد اختبار للقواعد النحوية. يريد أصحاب العمل رؤية أنك تفهم فلسفة اللغة: الأمان من القيم الخالية، الأسلوب الوظيفي، التعابير الاصطلاحية وخصائص التجميع. في هذه المقالة، قمنا بتحليل الأسئلة الأكثر شيوعًا - من الأساسية إلى المتقدمة. استعد للمقابلة بنسبة 100%.
\n\n1. الأسئلة الأساسية: القواعد النحوية و null safety
\n\nعادةً ما تبدأ المقابلة بالأساسيات. إليك ما يجب أن تعرفه بالتأكيد.
\n\nما هي أنواع البيانات في Kotlin وكيف تختلف عن Java؟
\nKotlin هي لغة مكتوبة بشكل ثابت. جميع الأنواع هي كائنات، لا توجد أنواع بدائية (لكن يمكن للمُجمّع تحسينها). الأنواع الرئيسية: Int، Double، Boolean، String، Array. على عكس Java، لا يوجد new في Kotlin لإنشاء الكائنات، ويتم تمييز الأنواع القابلة للقيم الخالية صراحةً بعلامة ?.
ما هو null safety وكيف يطبقه Kotlin؟
\nNull safety هو حماية مدمجة من NullPointerException. تنقسم الأنواع إلى قابلة للقيم الخالية (String?) وغير قابلة للقيم الخالية (String). للوصول الآمن، استخدم العوامل التالية:
val name: String? = null\nprintln(name?.length) // استدعاء آمن -> null\nprintln(name?.length ?: 0) // عامل الإلفيس -> 0\nprintln(name!!.length) // إجبار -> NPE، إذا كان null\n\nما الفرق بين val و var؟
\n- \n
val- مرجع غير قابل للتغيير (للقراءة فقط). مشابه لـfinalفي Java. \nvar- مرجع قابل للتغيير (قابل للتحوير). \n
هام: val لا يضمن عدم قابلية تغيير الكائن نفسه، فقط المرجع.
2. الهياكل المتقدمة: الفئات، الدوال و sealed
\n\nهنا يتم اختبار القدرة على كتابة كود موجز وآمن.
\n\nما هو data class وما هي الدوال التي يولدها؟
\ndata class هو فئة مخصصة لتخزين البيانات. يقوم المُجمّع تلقائيًا بتوليد: equals()، hashCode()، toString()، copy()، و componentN().
data class User(val id: Int, val name: String)\nval user = User(1, "Alice")\nval copy = user.copy(name = "Bob")\nprintln(user) // User(id=1, name=Alice)\n\nما هو sealed class ومتى يتم استخدامه؟
\nsealed class هو تسلسل هرمي محدود للفئات. يجب الإعلان عن جميع الفئات الفرعية في نفس الملف. مثالي لتمثيل الحالات (مثل نتيجة التحميل).
sealed class Result {\n data class Success(val data: String) : Result()\n data class Error(val message: String) : Result()\n object Loading : Result()\n}\n\nfun handle(result: Result) = when (result) {\n is Result.Success -> println(result.data)\n is Result.Error -> println(result.message)\n Result.Loading -> println("Loading...")\n}\nالميزة: يجب أن يكون when شاملاً - سيتحقق المُجمّع من جميع الخيارات.
ما هي extension functions وكيف تعمل؟
\nتسمح extension functions بإضافة دالة جديدة إلى فئة موجودة دون وراثة. في الواقع، هي دوال ثابتة تأخذ مثيل الفئة كوسيط أول.
\nfun String.isEmail(): Boolean = this.contains("@")\nprintln("test@mail.ru".isEmail()) // true\n\n3. البرمجة الوظيفية: اللامبدا، المجموعات، نطاقات الرؤية
\n\nيستخدم Kotlin بشكل نشط الأسلوب الوظيفي. كن مستعدًا للأسئلة حول العمل مع المجموعات ودوال النطاق.
\n\nما هي دوال النطاق (scope functions) التي تعرفها؟ كيف تختلف؟
\nالأساسية: let، run، with، apply، also. الفرق الرئيسي هو السياق (this أو it) والقيمة المُرجعة.
| الدالة | السياق |
|---|