0Pricing
Kotlin Academy · درس

معامل !!: متى ولماذا يجب تجنّبه

تعرّف على معامل التأكيد على عدم كون القيمة null ومخاطره والبدائل الأفضل له.

معامل !!: متى ولماذا يجب تجنّبه درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ما هو !!؟

يحوّل معامل التأكيد على عدم null !! النوع القابل لـ null إلى نوع غير قابل لـ null. وإذا كانت القيمة null وقت التشغيل، فإنه يطرح NullPointerException.

الاستخدام الأساسي لـ !!

تُرجع x!! قيمة x إذا لم تكن null، وإلا فإنها تطرح NPE.

fun main() {
    val name: String? = "Kotlin"
    val len: Int = name!!.length // 6
    println(len)
}

يطرح !! استثناء عند وجود null

إذا كانت القيمة null فعلًا، فستحصلون على الاستثناء نفسه الذي تحاول Kotlin منع حدوثه.

fun main() {
    val name: String? = null
    try {
        println(name!!.length)
    } catch (e: NullPointerException) {
        println("NPE caught!")
    }
}

الأفضل: الاستدعاء الآمن

بدلًا من !!، فضّلوا ?. — لمعالجة سلسة دون أعطال.

fun main() {
    val name: String? = null
    val len = name?.length
    println(len) // null — no crash
}

الأفضل: معامل Elvis

ادمجوا ?. مع ?: لتوفير قيمة افتراضية معقولة.

fun main() {
    val name: String? = null
    val len = name?.length ?: 0
    println(len) // 0
}

الأفضل: التحويل الذكي

يتيح التحقق باستخدام if (x != null) إجراء تحويل ذكي، فلا حاجة إلى !!.

fun main() {
    val name: String? = "Alice"
    if (name != null) {
        println(name.length) // smart-cast to String
    }
}

الأفضل: requireNotNull

إذا كان يجب أن تكون القيمة موجودة، فإن requireNotNull(x) { "..." } يطرح IllegalArgumentException ذا معنى واضح.

fun process(name: String?) {
    val safe = requireNotNull(name) { "name is required" }
    println("processing $safe")
}
fun main() {
    process("Ada")
    // process(null) // throws IllegalArgumentException: name is required
}

الأفضل: checkNotNull

يتصرف checkNotNull(x) بالطريقة نفسها، لكنه يطرح IllegalStateException — فاستخدموه للتحققات الثابتة.

class Service {
    private var data: String? = null
    fun load() { data = "loaded" }
    fun read(): String = checkNotNull(data) { "load() must be called first" }
}
fun main() {
    val s = Service()
    s.load()
    println(s.read())
}

الاستخدامات المشروعة لـ !!

استخدام نادر لكنه صحيح: عندما يكون غياب null شرطًا ثابتًا حقيقيًا لا يمكن إثباته وقت الترجمة (مثلًا بعد استدعاء انعكاسي). علّقوا موضحين السبب.

fun main() {
    val list = listOf(1, 2, 3)
    val firstEven: Int = list.find { it % 2 == 0 }!! // safe: we know list has an even
    println(firstEven)
}

تسلسل !! — أكبر نمط مضاد

يُعد استخدام عدة !! في سلسلة علامة على مشكلة في الشيفرة. أعيدوا الهيكلة باستخدام الاستدعاءات الآمنة وعبارات الحراسة.

class A(val b: B?)
class B(val c: C?)
class C(val name: String?)
fun main() {
    val a: A? = A(B(C("ok")))
    // BAD: val n = a!!.b!!.c!!.name!!
    val n = a?.b?.c?.name ?: "unknown"
    println(n)
}

إزالة !! من خلال إعادة الهيكلة

استبدلوا !! بواجهة برمجية أكثر صدقًا: قيم مرجعة قابلة لـ null، أو استخدام requireNotNull عند الدخول، أو الإرجاع المبكر.

fun firstUpper(s: String?): String? = s?.firstOrNull()?.uppercase()
fun main() {
    println(firstUpper("alice")) // A
    println(firstUpper(""))      // null
    println(firstUpper(null))    // null
}

تحقق سريع

ماذا يحدث إذا طبقتم !! على قيمة تساوي null فعلًا وقت التشغيل؟

مراجعة

يُعد !! مخرجًا يتجاوز أمان null في Kotlin. فضّلوا ?. أو ?: أو التحويلات الذكية أو requireNotNull أو checkNotNull. واقصروا استخدام !! على الشروط الثابتة الموثقة التي لا يستطيع المترجم إثباتها.

الأسئلة الشائعة

هل درس «معامل !!: متى ولماذا يجب تجنّبه» مجاني؟

نعم — نص درس «معامل !!: متى ولماذا يجب تجنّبه» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ماذا ستتعلم في «معامل !!: متى ولماذا يجب تجنّبه»؟

تعرّف على معامل التأكيد على عدم كون القيمة null ومخاطره والبدائل الأفضل له. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟

لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «معامل !!: متى ولماذا يجب تجنّبه»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟

نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الأنواع القابلة للقيمة null والمعدّل ?
  2. الاستدعاء الآمن ?. وElvis ?: في الشيفرة الفعلية
  3. ‏let وalso وrun مع المستقبلات القابلة للقيمة null
  4. معامل !!: متى ولماذا يجب تجنّبه
← العودة إلى Kotlin Academy