?. / ?: / !!
عوامل أمان القيم الفارغة ?. / ?: / !!
?. للاستدعاء الآمن، و?: لقيمة بديلة عند null، و!! للتأكيد غير الآمن الذي يرمي استثناءً.
نظام النوع في Kotlin يميّز بين الأنواع القابلة لـ null (بإضافة ?) وغير القابلة لها. الاستدعاء الآمن ?. يُرجع null بدل تعطّل البرنامج إن كان الكائن null. عامل إلفيس ?: يوفّر قيمة بديلة عندما يكون الطرف الأيسر null. أمّا !! فيؤكّد للكومبايلر أن القيمة ليست null، ويرمي KotlinNullPointerException إن كانت كذلك — لذلك يُستخدم بحذر شديد.
الصياغة
كائن?.خاصية قيمة ?: بديل كائن!!.خاصية
📄 مثال
var nickname: String? = null val len1 = nickname?.length // null (بدل تعطّل) val len2 = nickname?.length ?: 0 // 0 (قيمة بديلة) nickname = "براء" val len3 = nickname!!.length // 4 — آمن هنا لأننا تأكّدنا يدويًّا
أهم النقاط
| العنصر | الوظيفة |
|---|---|
| ?. | استدعاء آمن — يُرجع null بدل تعطّل إذا كان الكائن null |
| ?: | عامل إلفيس — قيمة بديلة عندما يكون الطرف الأيسر null |
| !! | تأكيد غير آمن — يرمي استثناءً إن كانت القيمة null فعلًا |
💡 نصائح عملية
- سلسلة ?. متعددة مسموحة: a?.b?.c — تتوقف عند أول null وتُرجع null للناتج كاملًا
- اجعل !! آخر خيار؛ استخدم ?: أو let أو التحقق الصريح بدلًا منه في أغلب الحالات
⚠️ أخطاء شائعة
- استخدام !! بشكل متكرر يعيد نفس مشكلة NullPointerException التي صُمم null safety لتفاديها
- الخلط بين ?: (بديل) و?. (استدعاء) — الأول يعمل على القيمة كاملة والثاني على الاستدعاء فقط
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار KOTLIN الكامل بالعربي.