Menu
flag Ar iconالعربيةdown icon

دوال جافا: كيفية تعريف الدوال واستدعائها

ما هي الدالة في جافا، وكيفية تعريفها واستدعائها، والفرق بين القيم المُعادة وvoid، ودالة main الساكنة، وكيف تُبقي الدوال الشيفرة منظمة وقابلة لإعادة الاستخدام.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

لماذا توجد الدوال

الدالة كتلة شيفرة لها اسم، يمكنك تشغيلها كلما استدعيت اسمها. فبدلًا من كتابة الأسطر نفسها مرارًا وتكرارًا، تكتبها مرة واحدة داخل دالة وتستدعيها بقدر ما تحتاج. وهذا يجعل البرامج أقصر وأسهل قراءةً وأسهل بكثير في الإصلاح؛ فأنت تغيّر المنطق في مكان واحد فيحصل كل من يستدعيه على التحديث.

لقد كنت تستدعي الدوال بالفعل: فـ System.out.println(...) هو استدعاء لدالة، وكذلك list.size(). والآن ستكتب دوالك الخاصة.

تعريف الدالة واستدعاؤها

يتكوّن تعريف الدالة من أربعة أجزاء: نوع الإرجاع، والاسم، وزوج من القوسين (للمعاملات)، وجسم محاط بقوسين معقوفين. وإليك أصغر مثال مفيد: دالة تؤدي بعض العمل ولا تعيد شيئًا:

اقرأ أجزاء static void printGreeting():

  • static: تتيح لـ main استدعاءها مباشرة دون إنشاء كائن (مزيد عن هذا أدناه).
  • void: هذه الدالة لا تعيد أي قيمة.
  • printGreeting: الاسم الذي تستخدمه لاستدعائها.
  • (): القوسان الفارغان يعنيان أنها لا تأخذ أي مدخلات.

تستدعي الدالة بكتابة اسمها متبوعًا بقوسين. الاستدعاءان داخل main يُشغّلان الجسم مرتين، لذا تطبع هذه الشيفرة التحية مرتين.

إعادة قيمة

تحسب معظم الدوال شيئًا ما وتعيده عبر return. ونوع الإرجاع الذي يسبق الاسم يحدد نوع القيمة الخارجة؛ وهنا int:

تُقيَّم square(5) إلى 25، التي يمكنك تخزينها في متغير أو طباعتها أو استخدامها داخل تعبير أكبر؛ فاستدعاء الدالة ينوب عن القيمة التي تعيدها. وفي اللحظة التي يُنفَّذ فيها return، تنتهي الدالة ويعود التحكم إلى المُستدعِي. وأي شيفرة تأتي بعد return على المسار نفسه لا تُنفَّذ أبدًا.

يجب أن يتطابق نوع الإرجاع مع القيمة المُعادة. وتعريف int ثم محاولة return "text"; خطأ في الترجمة؛ فالمترجم يفرض هذا العقد.

void مقابل نوع الإرجاع

التمييز بسيط: استخدم نوع إرجاع حقيقيًا عندما يحتاج المُستدعِي إلى استرجاع قيمة، واستخدم void عندما تكتفي الدالة بـفعل شيء (تطبع، تحفظ، تحدّث حالة).

void logMessage(String msg)   // تؤدي عملًا ولا تعيد شيئًا
int  add(int a, int b)        // تحسب قيمة يستخدمها المُستدعِي

من الأخطاء الشائعة لدى المبتدئين محاولة استخدام «نتيجة» دالة void:

int x = printGreeting();   // خطأ في الترجمة: printGreeting() تعيد void

لا توجد قيمة لإسنادها، لذا لن تُترجَم هذه الشيفرة. وإذا وجدت نفسك ترغب في الحصول على نتيجة دالة void، فتلك إشارة إلى أنها ينبغي أن تعيد شيئًا بدلًا من ذلك.

دوال تتفرّع وتُعيد مبكرًا

يمكنك استخدام return من أكثر من موضع. والإعادة المبكرة — بمجرد أن تعرف الإجابة — كثيرًا ما تُقرأ بوضوح أكبر من تداخل كل شيء داخل else:

ولأن كل return يخرج فورًا، يفوز أول شرط مطابق. تأكّد فقط من أن كل مسار يمر عبر دالة تعيد قيمة ينتهي بـ return؛ فإن كان بإمكان أحد الفروع أن يمضي دون إعادة شيء، اشتكى المترجم بـ «missing return statement». وعبارة return "F"; الأخيرة هنا تغطّي حالة عدم تطابق أي شرط.

ماذا تعني static هنا

ربما لاحظت أن كل دالة أعلاه static. فالدالة static تنتمي إلى الصنف نفسه لا إلى أي كائن، لذا يستطيع main (وهو static أيضًا) استدعاءها مباشرة باسمها. ومن دون static، تنتمي الدالة إلى نسخة (instance) وستحتاج إلى كائن لتستدعيها عليه.

في الوقت الراهن، وما دمت تكتب برامج صغيرة يعيش منطقها إلى جانب main، ضع static على دوالك المساعدة كي يمكن استدعاؤها بالطريقة نفسها. وحين تبدأ ببناء أصنافك وكائناتك الخاصة، ستكتب أيضًا دوالًا غير ساكنة (دوال النسخة)؛ وهذا يأتي مع فصل الأصناف.

المتغيرات المحلية تبقى داخل الدالة

المتغيرات المُعرَّفة داخل دالة لا توجد إلا فيها. تُنشأ عند تشغيل الدالة وتختفي عند عودتها؛ والمُستدعِي لا يراها أبدًا:

يعيش total وi داخل sumTo بالكامل. والشيء الوحيد الذي يفلت من الدالة هو القيمة التي تُعيدها عبر return. وهذا العزل ميزة: فكل دالة وحدة مكتفية بذاتها يمكنك التفكير فيها دون القلق من تسرّب متغيراتها المؤقتة إلى الخارج أو تصادمها مع أسماء في مكان آخر.

التالي: مَعاملات الدوال

كل دالة هنا إما لم تأخذ أي مدخل أو أخذت قيمة واحدة. وتأتي القوة الحقيقية من تمرير البيانات إلى الداخل — ولدى جافا قواعد محددة لكيفية تمرير الوسائط، ولما يحدث مع الكائنات مقابل الأنواع الأولية، ولكيفية منح المَعامل ما يشبه القيمة الافتراضية. وهذا موضوع الصفحة التالية.

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

ما هي الدالة في جافا؟

الدالة كتلة شيفرة لها اسم، يمكنك تشغيلها عند الطلب باستدعاء اسمها. تجمع جزءًا من العمل في مكان واحد كي تستطيع إعادة استخدامه بدلًا من تكرار الأسطر نفسها. يمكن للدالة أن تأخذ مدخلات (مَعاملات) وتعيد نتيجة (قيمة مُعادة)، أو أن تؤدي عملها دون أن تعيد شيئًا (void).

كيف تُنشئ دالة وتستدعيها في جافا؟

عرّفها بنوع إرجاع واسم وقوسين: static int square(int n) { return n * n; }. ثم استدعِها باسمها مع الوسائط بين القوسين: int result = square(5);. الدالة التي لا تعيد شيئًا تستخدم void وتُستدعى كجملة مستقلة، مثل printGreeting();.

ماذا تعني void في دالة جافا؟

تعني void أن الدالة لا تعيد أي قيمة؛ فهي تؤدي عملها (مثل الطباعة) ولا تسلّم شيئًا للمُستدعِي. لا يمكنك إسناد نتيجة دالة void إلى متغير. وإذا كان على الدالة أن تنتج قيمة يستخدمها المُستدعِي، فامنحها نوع إرجاع حقيقيًا مثل int أو String واستخدم return بدلًا من ذلك.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن