«instanceof» في Kotlin: التحقق من النوع باستخدام is و when (دليل)

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

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

ابدأ الدورة

«instanceof» في Kotlin: لماذا ليس مثل Java، وكيف يجعل الكود أنظف

\n\n

إذا أتيت إلى Kotlin من عالم Java، فأنت بالتأكيد معتاد على الكلمة المفتاحية instanceof. فهي تساعد في معرفة ما إذا كان الكائن هو نسخة من فئة معينة. لكن في Kotlin، لا يوجد هذا العامل. وهذا ليس خطأ، بل ميزة.

\n\n

يقدم Kotlin طريقة أكثر أناقة وأمانًا وإيجازًا للتحقق من نوع الكائن — وهو العامل is. فهو لا يجيب على السؤال "من أنت؟" فحسب، بل يقوم أيضًا بتحويل الكائن تلقائيًا إلى النوع المطلوب. يُسمى هذا التحويل الذكي (smart cast)، وهي إحدى الميزات التي تجعل الكود في Kotlin ممتعًا للغاية.

\n\n

في هذا الدليل، سنتناول:

\n
    \n
  • كيفية استخدام العامل is بدلاً من instanceof؛
  • \n
  • ما هو التحويل الذكي وكيف يعمل؛
  • \n
  • كيفية معالجة أنواع متعددة بأناقة باستخدام when؛
  • \n
  • الفرق بين التحويل الآمن as? والتحويل العادي as؛
  • \n
  • وبالطبع، أمثلة كود حقيقية.
  • \n
\n\n

هيا بنا!

\n\n

1. العامل is — البديل المباشر لـ instanceof

\n\n

في Java، كنت ستكتب:

\n
if (obj instanceof String) {\n    String str = (String) obj;\n    System.out.println(str.length());\n}
\n\n

في Kotlin، نفس الشيء يبدو كالتالي:

\n
if (obj is String) {\n    println(obj.length) // تحويل ذكي! obj أصبح String بالفعل\n}
\n\n

لاحظ: بعد التحقق obj is String، لست بحاجة إلى تحويل obj بشكل صريح إلى النوع String. يعرف مترجم Kotlin بنفسه أنه داخل كتلة if، المتغير obj هو بالتأكيد سلسلة نصية. هذا هو التحويل الذكي (smart cast).

\n\n

كيف يعمل هذا تحت الغطاء؟

\n

يقوم المترجم بتحليل تدفق التنفيذ. إذا رأى تحققًا باستخدام is ولم يجد إمكانية لتغيير نوع المتغير بين التحقق والاستخدام (على سبيل المثال، في الكود متعدد الخيوط أو عند تغيير var)، فإنه يقوم بتحويل النوع تلقائيًا. بالنسبة لـ val، يعمل هذا دائمًا، أما بالنسبة لـ var، فيعمل فقط إذا لم يمكن تغيير المتغير بين التحقق والاستخدام.

\n\n

2. النفي: !is

\n\n

هل تريد التحقق من أن الكائن ليس من النوع؟ استخدم !is:

\n
if (obj !is String) {\n    println("هذا ليس سلسلة نصية")\n} else {\n    // هنا أصبح obj تلقائيًا String\n    println("طول السلسلة: ${obj.length}")\n}
\n\n

مريح وسهل القراءة، أليس كذلك؟

\n\n

3. التحقق المتعدد باستخدام when

\n\n

والآن تخيل أن لديك كائنًا يمكن أن يكون واحدًا من عدة أنواع. في Java، كنت ستكتب سلسلة من if-else if مع instanceof. في Kotlin، هناك أداة أكثر أناقة — وهي بنية when.

\n\n
fun describe(obj: Any): String {\n    return when (obj) {\n        is String -> "سلسلة نصية طولها ${obj.length}"\n        is Int -> "عدد صحيح: $obj"\n        is List<*> -> "قائمة تحتوي على ${obj.size} عناصر"\n        is Map<*, *> -> "خريطة تحتوي على ${obj.size} إدخالات"\n        else -> "نوع غير معروف"\n    }\n}\n\nfun main() {\n    println(describe("مرحبًا"))   // سلسلة نصية طولها 5\n    println(describe(42))         // عدد صحيح: 42\n    println(describe(listOf(1,2)))// قائمة تحتوي على 2 عناصر\n}
\n\n

لاحظ: داخل كل فرع من when، يعمل التحويل الذكي أيضًا! في الفرع is String، يعتبر المتغير obj بالفعل سلسلة نصية، ويمكنك استدعاء obj.length دون تحويل إضافي.

\n\n

هذا أكثر إحكامًا وأمانًا من switch التقليدي أو سلسلة if.

\n\n

4. التحويل الآمن: as?

\n\n

أحيانًا لا تحتاج فقط إلى التحقق من النوع، بل إلى الحصول فورًا على قيمة من نوع معين. في Java، كنت ستقوم بـ (String) obj

المدونات

توصيات الكتب