مشغل !! في Kotlin: ما هو وكيف لا تفسد الكود

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

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

ابدأ الدورة

كوتلن، القيم الفارغة وعلامة التعجب المزدوجة: مقدمة

\n\n

هل سبق لك أن كتبت كودًا بلغة Kotlin، ووبخك المترجم بسبب قيمة null محتملة، فقمت بوضع علامتي تعجب — !! — ومضيت قدمًا؟ إذا كان الأمر كذلك، فأنت بالفعل على دراية ببطل مقالتنا — مشغل double bang (المعروف أيضًا باسم مشغل !! في Kotlin).

\n\n

هذا الرمز هو في نفس الوقت منقذ وأداة خطيرة. فهو يخبر المترجم: «اخرس، أنا أعرف ما أفعله، هذا المتغير بالتأكيد ليس null». ولكن إذا أخطأت، فسينهار التطبيق مع NullPointerException. يبدو مخيفًا؟ في الحقيقة، إنها مجرد آلية قوية تحتاج إلى فهمها واستخدامها بحكمة.

\n\n

في هذا الدليل، سنشرح ما هو double bang Kotlin، وكيف يعمل، وأين يمكن استخدامه، وأين من الأفضل البحث عن بدائل. ستتعلم كيف لا تؤذي نفسك وتكتب كودًا موثوقًا.

\n\n

المشكلة التي يحلها !! : أمان القيم الفارغة في Kotlin

\n\n

تم إنشاء Kotlin كلغة تهدف إلى القضاء على NullPointerException (NPE). وقد نجحت في ذلك تقريبًا. في Kotlin، لا يمكن للأنواع أن تكون null بشكل افتراضي. لا يمكنك ببساطة تعيين قيمة null لمتغير من النوع String — المترجم لن يسمح بذلك.

\n\n
var name: String = "آليس"\nname = null // خطأ في الترجمة!\n
\n\n

لكن العالم الحقيقي مليء بعدم اليقين. البيانات تأتي من قاعدة البيانات، من المستخدم، من الشبكة. لذلك أدخلت Kotlin الأنواع القابلة للقيم الفارغة (nullable types) — وهي أنواع يمكن أن تكون null. ويتم الإشارة إليها بعلامة استفهام: String?.

\n\n
var nullableName: String? = "بوب"\nnullableName = null // الآن يمكن ذلك\n
\n\n

وهنا يبدأ السحر. لا يمكنك ببساطة استدعاء دالة على متغير nullable:

\n\n
val length = nullableName.length // خطأ! "Only safe (?.) or non-null asserted (!!.) calls are allowed"\n
\n\n

Kotlin تجبرك على معالجة القيمة null. هذا عبقري — لن تنسى التحقق. لكن في بعض الأحيان، أنت تعرف يقينًا أن القيمة ليست null. وهنا يأتي دور مشغل علامة التعجب المزدوجة في Kotlin.

\n\n

ما هو مشغل !! (double bang)؟

\n\n

مشغل !! في Kotlin هو مشغل تأكيد إجباري على أن القيمة غير فارغة (non-null assertion). فهو يأخذ قيمة nullable ويحولها إلى نوع non-null. إذا كانت القيمة null، فسيتم إلقاء KotlinNullPointerException.

\n\n

من الناحية التركيبية، يبدو كعلامتي تعجب بعد المتغير:

\n\n
val nonNullValue = nullableValue!!
\n\n

كيف يعمل هذا بمثال

\n\n

تخيل أن لديك دالة تبحث عن مستخدم بواسطة المعرف. إنها تُرجع User?، لأنه قد لا يكون هناك مستخدم. لكنك تعرف يقينًا أنه في بيئة الاختبار الخاصة بك، يوجد مستخدم بالمعرف 1.

\n\n
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
  1. التفاعل مع كود Java. Java لا تعرف عن تعليقات nullable. إذا أعادت دالة Java كائنًا، يراه Kotlin كنوع Platform Type (مثل String!). يمكنك التعامل معه كما تشاء. ولكن ا

المدونات

توصيات الكتب