0Pricing
Kotlin Academy · درس

الأنواع القابلة للقيمة null والمعدّل ?

صرّح عن متغيرات قابلة للقيمة null وتعرّف على أمان Kotlin من null وقت الترجمة.

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

أمان null في Kotlin

تميّز Kotlin، وقت الترجمة، بين الأنواع التي يمكنها احتواء null والأنواع التي لا يمكنها ذلك. ويمنع المترجم معظم استثناءات NullPointerException قبل وقت التشغيل.

نوع غير قابل لـ null

لا يمكن لنوع Kotlin أن تكون قيمته null افتراضيًا. حاولوا إسناد null إليه، وسيرفض المترجم ذلك.

fun main() {
    val name: String = "Ada"
    // val nope: String = null // ERROR
    println(name)
}

نوع قابل لـ null باستخدام ?

أضيفوا ? للسماح بقيمة null. وسيتعامل المترجم عندها مع المتغير على أنه قد لا يحتوي على قيمة.

fun main() {
    val name: String? = null
    println(name) // null
}

استدعاء الدوال على القيم القابلة لـ null

لا يمكنكم استدعاء دالة مباشرةً على قيمة قابلة لـ null قبل معالجة حالة null أولًا. سيرفض المترجم ذلك.

fun main() {
    val name: String? = "Bob"
    // println(name.length) // ERROR — name might be null
    if (name != null) println(name.length) // smart cast
}

التحويلات الذكية

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

fun main() {
    val name: String? = "Alice"
    if (name != null) {
        println("Length: ${name.length}") // safe, smart-cast
    } else {
        println("No name")
    }
}

معلمة دالة قابلة لـ null

اجعلوا معلمات الدالة قابلة لـ null عندما يكون من المحتمل غيابها. وعندها يجب على المستدعي توفير قيمة أو null صراحةً.

fun greet(name: String?) {
    if (name == null) println("Hello, stranger")
    else println("Hello, $name")
}
fun main() {
    greet("Sara")
    greet(null)
}

نوع القيمة المرجعة القابل لـ null

يخبر النوع X? في دالة مرجعة المستدعيَ بأنها قد تُرجع null، ولذلك يجب عليه معالجة هذه الحالة.

fun findUser(id: Int): String? {
    return if (id == 1) "Alice" else null
}
fun main() {
    val u = findUser(2)
    println(u ?: "no user")
}

الخصائص القابلة لـ null

يمكن أن تكون خصائص الفئة قابلة لـ null أيضًا. ويشيع ذلك عندما تُملأ الحقول لاحقًا أو تُجلب قيمها بصورة اختيارية.

data class Profile(
    val name: String,
    val avatarUrl: String?
)
fun main() {
    val p = Profile("Lee", null)
    println(p.avatarUrl ?: "(no avatar)")
}

مقارنة مع Java

تظهر أنواع Java التي تنتقل إلى Kotlin باعتبارها platform types (String!) — تثق Kotlin بكم، لكنها لا توفر أمانًا للقيم null. احرصوا دائمًا على وسم واجهات Java باستخدام @Nullable/@NotNull متى أمكن.

fun main() {
    val maybeList: List<Int>? = null
    val listOfMaybe: List<Int?> = listOf(1, null, 3)
    println(maybeList?.size)     // null
    println(listOfMaybe.size)    // 3
}

مقارنة مع Java

تظهر أنواع Java عند انتقالها إلى Kotlin على هيئة أنواع المنصة (String!) — تثق بك Kotlin، لكنها لا توفر أمانًا من القيم الفارغة. احرص دائمًا، متى أمكن، على وسم واجهات Java البرمجية بالتعليقين @Nullable/@NotNull.

fun main() {
    val maybeNull: String? = System.getenv("FOO") // null if unset
    println("env FOO = ${maybeNull ?: "(unset)"}")
}

أهمية ذلك

يمنع أمان null وقت الترجمة فئة كاملة من الأعطال وقت التشغيل. اعتمدوا معدّل ? — فهو يوثق القصد ويفرض معالجة الحالة.

fun divide(a: Int, b: Int): Int? = if (b == 0) null else a / b
fun main() {
    val r1 = divide(10, 2) // 5
    val r2 = divide(10, 0) // null — handled at call site
    println("$r1, $r2")
}

تحقق سريع

ماذا يعني وجود ? في نهاية تصريح النوع؟

مراجعة

تكون أنواع Kotlin غير قابلة لـ null افتراضيًا. أضيفوا ? للسماح بـ null. ويفرض المترجم معالجة null باستخدام التحويلات الذكية والاستدعاءات الآمنة ومعامل Elvis، مما يمنع معظم استثناءات NullPointerException قبل وقت التشغيل.

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

هل درس «الأنواع القابلة للقيمة null والمعدّل ?» مجاني؟

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

ماذا ستتعلم في «الأنواع القابلة للقيمة null والمعدّل ?»؟

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

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

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

كم من الوقت يستغرق درس «الأنواع القابلة للقيمة null والمعدّل ?»؟

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

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

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

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

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