Kotlin Void, Unit, Nothing: الدليل الشامل 2025

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

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

ابدأ الدورة

Kotlin - Void vs. Unit vs. Nothing: أفضل الممارسات في 2025

\n\n

مرحبًا أيها الزملاء! إذا كنت قد كتبت يومًا بلغة Kotlin وتساءلت: "لماذا Unit هنا وليس void؟ وما هذا المخلوق Nothing؟" — فقد وصلت إلى المكان الصحيح. هذا الموضوع هو حديث الساعة على Stack Overflow بآلاف المشاهدات، وليس من دون سبب. فالخلط بين Void وUnit وNothing يمكن أن يربك حتى المطورين ذوي الخبرة. في عام 2025، بينما تحتل Kotlin مكانة راسخة في الواجهة الخلفية (Ktor, Spring) وAndroid، فإن فهم هذه الأنواع ليس مجرد رفاهية، بل ضرورة لكتابة كود نظيف وآمن ومعبّر.

\n\n

في هذه المقالة، لن نقوم فقط بسرد التعريفات. سنقوم بتحليلها بأمثلة حقيقية، ونوضح أين يكون كل منها مناسبًا، وأين يعتبر خطيئة مميتة. هيا بنا!

\n\n

باختصار عن الشيء الرئيسي: ما هو كل شيء؟

\n\n

دعونا نوضح الأمور من البداية. هذه الأنواع الثلاثة تحل مشاكل مختلفة، على الرغم من أنها تبدو متشابهة للوهلة الأولى.

\n\n
    \n
  • Void — هو من بقايا Java. في Kotlin، هو موجود فقط للتوافق. لا تستخدمه أبدًا في كود Kotlin الخالص.
  • \n
  • Unit — يعني "أنا لا أعيد شيئًا، لكنني ما زلت نوعًا". وهو مشابه لـ void في Java، ولكنه أفضل. يُستخدم في 99% من الحالات عندما لا تُرجع الدالة نتيجة ذات معنى.
  • \n
  • Nothing — يعني "الدالة لن تنتهي بشكل طبيعي أبدًا". إما أن ترمي استثناءً، أو تدخل في حلقة لا نهائية. إنها أداة قوية للتحكم في تدفق التنفيذ.
  • \n
\n\n

يبدو الأمر بسيطًا؟ دعنا نتعمق أكثر.

\n\n

Void — الغريب بين أهله

\n\n

إذا كنت تكتب بلغة Kotlin الخالصة، فانسَ أمر Void كما تنسى كابوسًا. إنها فئة من Java (java.lang.Void) وهي غلاف للكلمة المفتاحية void. وهي موجودة في Kotlin فقط للتفاعل مع كود Java.

\n\n

مثال على ظهور Void في مشروعك:

\n\n
import java.lang.Void\n\n// لا تفعل هذا أبدًا في Kotlin الخالص!\nfun doSomething(): Void? {\n    println("أفعل شيئًا...")\n    return null // يجب إرجاع null، وإلا سيحدث خطأ في الترجمة\n}
\n\n

هل ترى هذا return null؟ هذا هو العيب الرئيسي. Void هو لا يمكن إنشاء مثيل له (لديه مُنشئ خاص)، ولكنه يمكن أن يكون null. هذا يسبب ارتباكًا وكودًا زائدًا.

\n\n

أفضل ممارسة لعام 2025: استخدم Void فقط إذا كنت تعيد تعريف طريقة من مكتبة Java تتطلب Void كمعامل عام. على سبيل المثال، في Callable<Void>. في جميع الحالات الأخرى — استخدم Unit.

\n\n

Unit — ملك الدوال الفارغة

\n\n

Unit هي طريقة Kotlin الحقيقية لقول: "تم تنفيذ الدالة، لكن النتيجة لا تهمني". على عكس void، فإن Unit هو نوع كامل بقيمة واحدة فقط — Unit.

\n\n

هذا يعطي إمكانيات رائعة:

\n\n
    \n
  1. الأدوية (Generics). يمكنك استخدام Unit في الدوال العامة.
  2. \n
  3. دوال الترتيب الأعلى. يمكنك تمرير دالة تُرجع Unit كوسيطة.
  4. \n
  5. الإضافات (Extensions). يمكنك كتابة دوال إضافية تُرجع Unit.
  6. \n
\n\n

مثال قياسي — تعبيرات لامدا:

\n\n
fun executeAction(action: () -> Unit) {\n    println("التحضير للتنفيذ...")\n    action() // استدعاء الدالة المُمررة\n    println("تم تنفيذ الإجراء.")\n}\n\nfun main() {\n    // لامدا لا تُرجع شيئًا، ولكنها تُحدث تأثيرًا جانبيًا\n    executeAction {\n        println("مرحبًا من لامدا!")\n    }\n}
\n\n

هنا

المدونات

توصيات الكتب