الأنواع Nullable وNon-Null
أساسيات نظام الأنواع
الأنواع Nullable وNon-Null درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
لماذا تهم سلامة القيم الخالية
تسبّب NullPointerException سيئة السمعة في تعطل عدد لا يُحصى من البرامج. تعالج Kotlin هذه المشكلة مباشرةً بجعل قابلية القيمة للخلو جزءًا من نظام الأنواع.
يعرف المترجم في Kotlin ما إذا كانت القيمة يمكن أن تكون null أم لا، ويفرض عليك معالجة هذا الاحتمال قبل أن تواجه مشكلة.
الأنواع غير القابلة للخلو
كل نوع في Kotlin هو غير قابل للخلو افتراضيًا. ولا يمكن لمتغير من النوع String أن يحتوي على null مطلقًا.
يُفرض هذا الضمان في وقت الترجمة، لذلك يمكنك استخدام القيمة بحرية من دون عمليات تحقق.
fun main() {
val name: String = "Alice"
println(name.length)
}رفض إسناد null
إذا حاولت وضع null في نوع غير قابل للخلو، فسيوقفك المترجم فورًا.
سيفشل السطر أدناه في الترجمة لأن String لا يقبل null:
val name: String = null→ خطأ
fun main() {
val city: String = "Paris"
// val broken: String = null // compile error
println(city)
}الأنواع القابلة للخلو
للسماح بـ null، أضف علامة استفهام بعد النوع: String?.
يُسمّى هذا نوعًا قابلًا للخلو. ويمكنه أن يحتوي على قيمة فعلية أو على null.
fun main() {
val maybeName: String? = null
println(maybeName)
}القابل للخلو مقابل غير القابل للخلو
يبدو التصريحان متشابهين تقريبًا، لكن سلوكيهما مختلف جدًا:
val a: String→ لا يكون null مطلقًاval b: String?→ قد يكون null
تغيّر علامة ? واحدة العقد الكامل للمتغير.
fun main() {
val a: String = "hi"
val b: String? = "hi"
println(a)
println(b)
}المترجم يحمي الوصول إلى القيم القابلة للخلو
لا يمكنك استدعاء دوال مباشرةً على قيمة قابلة للخلو. يرفض المترجم ذلك لأن القيمة قد تكون null.
لن ينجح السطر المعلّق أدناه في الترجمة:
maybe.lengthعلى قيمة من النوعString?→ خطأ
fun main() {
val maybe: String? = "text"
// println(maybe.length) // compile error
println(maybe)
}التحقق من null
تتمثل إحدى الطرق البسيطة لاستخدام قيمة قابلة للخلو في إجراء تحقق صريح باستخدام if.
داخل كتلة if، تعرف Kotlin أن القيمة ليست null وتسمح لك باستخدامها بأمان.
fun main() {
val maybe: String? = "hello"
if (maybe != null) {
println(maybe.length)
}
}null في معاملات الدوال
تتبع أنواع المعاملات القاعدة نفسها. يجب أن يتلقى المعامل من النوع String قيمة فعلية، بينما يقبل String? القيمة null.
وهذا يجعل توقيعات الدوال توضّح ذاتيًا ما تقبله.
fun greet(name: String?) {
if (name != null) {
println("Hello, " + name)
} else {
println("Hello, guest")
}
}
fun main() {
greet("Mia")
greet(null)
}أنواع القيم المعادة القابلة للخلو
يمكن للدوال إعادة أنواع قابلة للخلو للتعبير عن احتمال عدم توفر النتيجة.
وعندئذٍ يُجبر المستدعي على معالجة احتمال وجود null قبل استخدام النتيجة.
fun firstChar(text: String?): Char? {
if (text == null || text.isEmpty()) return null
return text[0]
}
fun main() {
println(firstChar("Kotlin"))
println(firstChar(null))
}الاستدلال الافتراضي
عند إسناد قيمة حرفية، تستنتج Kotlin تلقائيًا نوعًا غير قابل للخلو.
val n = "text"→ النوع المستنتج هوString
ولجعلها قابلة للخلو، يجب أن تصرّح عن النوع صراحةً باستخدام ?.
fun main() {
val n = "text" // inferred String (non-null)
val m: String? = "text" // explicit nullable
println(n.length)
println(m)
}جمع المفاهيم
يقسم نظام الأنواع القيم إلى مجموعتين واضحتين:
- غير قابلة للخلو: آمنة للاستخدام دائمًا
- قابلة للخلو: يجب التعامل معها قبل الاستخدام
ينقل هذا التمييز أخطاء null من أعطال وقت التشغيل إلى أخطاء وقت الترجمة.
fun main() {
val safe: String = "always here"
val risky: String? = null
println(safe.uppercase())
if (risky != null) println(risky.uppercase()) else println("no value")
}تحقّق سريعًا
اختبر فهمك للأنواع القابلة للخلو وغير القابلة للخلو.
مراجعة
لقد تعلمت أساسيات سلامة القيم الخالية في Kotlin:
- كل نوع غير قابل للخلو افتراضيًا
- تؤدي إضافة
?إلى إنشاء نوع قابل للخلو - يمنع المترجم الوصول غير الآمن إلى القيم القابلة للخلو
- يسمح لك التحقق باستخدام
if (x != null)باستعمال القيمة بأمان
ستتعلم بعد ذلك العوامل الموجزة التي تجعل التعامل مع القيم القابلة للخلو سهلًا.
الأسئلة الشائعة
هل درس «الأنواع Nullable وNon-Null» مجاني؟
نعم — نص درس «الأنواع Nullable وNon-Null» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «الأنواع Nullable وNon-Null»؟
أساسيات نظام الأنواع تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الأنواع Nullable وNon-Null»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الأنواع Nullable وNon-Null
- الاستدعاءات الآمنة وElvis
- المعامل !!
- أنواع المنصة