أخطاء Kotlin للمبتدئين: 5 أخطاء قاتلة وكيفية تجنبها

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا تبدو Kotlin سهلة ولكنها تخبئ المفاجآت

\n\n

Kotlin هي لغة حديثة، موجزة، ومريحة بشكل لا يصدق. كثير من المبتدئين يأتون إليها من Java أو Python ويعتقدون: "حسناً، كل شيء واضح هنا!". وبالفعل، بناء جملة Kotlin نظيف، والأنواع القابلة للعدم (nullable types) تحمي من أخطاء المؤشر الفارغ (NPE)، والميزات الوظيفية مثل let و apply و run تبدو سحرية في بساطتها. لكن هذه البساطة الظاهرية غالباً ما تصبح فخاً.

\n\n

في هذا المقال، سنستعرض أكثر أخطاء Kotlin الشائعة التي يقع فيها المبتدئون. ستتعلم كيفية تجنبها، وستحصل على أمثلة جاهزة للكود. إذا كنت قد بدأت للتو رحلتك في تعلم Kotlin للمبتدئين، فهذا المقال سينقذك من ساعات طويلة من التصحيح.

\n\n

الخطأ رقم 1: تجاهل null safety أو المبالغة في الحذر

\n\n

Kotlin تضمن null safety مباشرة في نظام الأنواع. هذه نعمة، لكن المبتدئين غالباً ما يقعون في نقيضين. الأول هو التجاهل التام واستخدام عامل !! (تأكيد عدم العدم) في كل خطوة. الثاني هو الإفراط في استخدام عامل إلفيس ?: وسلاسل ?.let التي تحول الكود إلى فوضى غير قابلة للقراءة.

\n\n

كيف يبدو الخطأ

\n\n
// سيء: استخدام !! بشكل مفرط — يقتل أمان Kotlin بالكامل\nfun processUser(user: User?) {\n    val name = user!!.name  // إذا كان user == null — تعطل!\n    println(name.uppercase())\n}\n\n// سيء: الكثير من let المتداخلة\nfun getUserCity(user: User?): String? {\n    return user?.let {\n        it.address?.let { addr ->\n            addr.city?.let { city ->\n                city.name\n            }\n        }\n    }\n}\n
\n\n

الطريقة الصحيحة

\n\n
// جيد: استخدام الاستدعاء الآمن + عامل إلفيس\nfun processUserSafe(user: User?) {\n    val name = user?.name ?: "ضيف"\n    println(name.uppercase())\n}\n\n// ممتاز: استخدام الإضافات ودوال النطاق بدون تداخل\nfun getUserCityClean(user: User?): String? {\n    return user?.address?.city?.name\n}\n
\n\n

نصيحة: استخدم عامل !! فقط إذا كنت متأكداً 100% أن القيمة ليست null (مثلاً بعد التحقق في if). في الحالات الأخرى، استخدم ?. و ?:.

\n\n

هذه واحدة من أهم مشاكل Kotlin للمبتدئين — فهم إما يخافون من null أو لا يفهمون كيفية التعامل معه. تذكر: Kotlin لا تمنع null، بل تجبرك على التفكير فيه.

\n\n

الخطأ رقم 2: عدم فهم الفرق بين var و val والثوابت

\n\n

يبدو أن val هو متغير نهائي، مثل final في Java. لكن لا. val هو مرجع للقراءة فقط (read-only)، وليس كائنًا غير قابل للتغيير. غالباً ما يخلط المبتدئون بين val وثابت وقت الترجمة (const val) ويتعجبون لماذا لا يعمل كودهم كما هو متوقع.

\n\n

مثال على الخلط

\n\n
// المبتدئ يعتقد: "val = غير قابل للتغيير"\nval list = mutableListOf(1, 2, 3)\nlist.add(4)  // يعمل! لكن المبتدئ في صدمة\n\n// وهذا خطأ في الترجمة\nval name = "أحمد"\nname = "خالد"  // خطأ: لا يمكن إعادة تعيين val\n
\n\n

كيف تفرق بينهم

\n\n
// ثابت وقت الترجمة — فقط للأنواع البدائية والنصوص\nconst val PI = 3.14159\n\n// مرجع للقراءة فقط — يمكن حسابه في وقت التشغيل\nval currentTime = System.currentTimeMillis()\n\n// عدم التغيير الحقيقي — استخدم المجموعات غير القابلة للتغيير\nval immutableList = listOf(1, 2, 3)  // listOf وليس mutableListOf\n
\n\n

القاعدة الذهبية: استخدم val في كل مكان ممكن. إذا كان المتغير يجب أن يتغير — عندها فقط استخدم var. أما const val فاستخدمه فقط للثوابت على المستوى الأعلى أو داخل object/companion object.

\n\n

الخطأ رقم 3: الإفراط في استخدام companion object و object-singletons

\n\n

Kotlin تقدم طريقة أنيقة لإنشاء المفردات (singletons) من خلال ob

المدونات

توصيات الكتب