كوتلن، القيم الفارغة وعلامة التعجب المزدوجة: مقدمة
\n\nهل سبق لك أن كتبت كودًا بلغة Kotlin، ووبخك المترجم بسبب قيمة null محتملة، فقمت بوضع علامتي تعجب — !! — ومضيت قدمًا؟ إذا كان الأمر كذلك، فأنت بالفعل على دراية ببطل مقالتنا — مشغل double bang (المعروف أيضًا باسم مشغل !! في Kotlin).
هذا الرمز هو في نفس الوقت منقذ وأداة خطيرة. فهو يخبر المترجم: «اخرس، أنا أعرف ما أفعله، هذا المتغير بالتأكيد ليس null». ولكن إذا أخطأت، فسينهار التطبيق مع NullPointerException. يبدو مخيفًا؟ في الحقيقة، إنها مجرد آلية قوية تحتاج إلى فهمها واستخدامها بحكمة.
في هذا الدليل، سنشرح ما هو double bang Kotlin، وكيف يعمل، وأين يمكن استخدامه، وأين من الأفضل البحث عن بدائل. ستتعلم كيف لا تؤذي نفسك وتكتب كودًا موثوقًا.
\n\nالمشكلة التي يحلها !! : أمان القيم الفارغة في Kotlin
\n\nتم إنشاء Kotlin كلغة تهدف إلى القضاء على NullPointerException (NPE). وقد نجحت في ذلك تقريبًا. في Kotlin، لا يمكن للأنواع أن تكون null بشكل افتراضي. لا يمكنك ببساطة تعيين قيمة null لمتغير من النوع String — المترجم لن يسمح بذلك.
var name: String = "آليس"\nname = null // خطأ في الترجمة!\n\n\nلكن العالم الحقيقي مليء بعدم اليقين. البيانات تأتي من قاعدة البيانات، من المستخدم، من الشبكة. لذلك أدخلت Kotlin الأنواع القابلة للقيم الفارغة (nullable types) — وهي أنواع يمكن أن تكون null. ويتم الإشارة إليها بعلامة استفهام: String?.
var nullableName: String? = "بوب"\nnullableName = null // الآن يمكن ذلك\n\n\nوهنا يبدأ السحر. لا يمكنك ببساطة استدعاء دالة على متغير nullable:
\n\nval length = nullableName.length // خطأ! "Only safe (?.) or non-null asserted (!!.) calls are allowed"\n\n\nKotlin تجبرك على معالجة القيمة null. هذا عبقري — لن تنسى التحقق. لكن في بعض الأحيان، أنت تعرف يقينًا أن القيمة ليست null. وهنا يأتي دور مشغل علامة التعجب المزدوجة في Kotlin.
ما هو مشغل !! (double bang)؟
\n\nمشغل !! في Kotlin هو مشغل تأكيد إجباري على أن القيمة غير فارغة (non-null assertion). فهو يأخذ قيمة nullable ويحولها إلى نوع non-null. إذا كانت القيمة null، فسيتم إلقاء KotlinNullPointerException.
من الناحية التركيبية، يبدو كعلامتي تعجب بعد المتغير:
\n\nval nonNullValue = nullableValue!!\n\nكيف يعمل هذا بمثال
\n\nتخيل أن لديك دالة تبحث عن مستخدم بواسطة المعرف. إنها تُرجع User?، لأنه قد لا يكون هناك مستخدم. لكنك تعرف يقينًا أنه في بيئة الاختبار الخاصة بك، يوجد مستخدم بالمعرف 1.
data class User(val name: String)\n\nfun findUser(id: Int): User? {\n // بعض منطق البحث\n return if (id == 1) User("آنا") else null\n}\n\nfun main() {\n val user = findUser(1)\n // نحن متأكدون أن user ليس null\n val userName = user!!.name\n println(userName) // سيُطبع: آنا\n}\n\n\nفي هذا المثال، عمل double bang Kotlin بشكل صحيح، وحصلنا على الاسم. لكن إذا كان المعرف 2، لكان التطبيق قد انهار مع استثناء.
\n\nمتى تستخدم !! (ومتى لا يجوز مطلقًا)
\n\nمشغل !! (double bang) يشبه الزر الأحمر. يمكنك الضغط عليه، ولكن فقط إذا كنت متأكدًا بنسبة 146%. دعنا نستعرض السيناريوهات المشروعة.
\n\nمتى يمكن (ويجب) استخدام !!
\n\n- \n
- التفاعل مع كود Java. Java لا تعرف عن تعليقات nullable. إذا أعادت دالة Java كائنًا، يراه Kotlin كنوع
Platform Type(مثلString!). يمكنك التعامل معه كما تشاء. ولكن ا