القيم المعادة

كانت بعض العمليات الجاهزة التي استخدمناها، مثل التوابع الرياضية، تعطي نتائجاً. أي أن الأثر الناجم عن استدعاء هذه العمليات هو توليد قيمة جديدة، نسندها عادة إلى متغير أو نستعملها كجزء من عبارة حسابية. مثلاً:
كود:
double e = Math.exp (1.0);
double height = radius * Math.sin (angle);
لكن جميع العمليات التي كتبناها حتى الآن كانت عمليات فارغة (أو عقيمة void methods)؛ أي أنها عمليات لا تعيد أية قيمة. عندما تستدعي عملية فارغة، ستكون العملية نموذجياً على سطر لوحدها، بدون أي إسناد:
كود:
nLines (3);
g.drawOval (0, 0, width, height);
في هذا الفصل، سوف نكتب عمليات تعيد أشياء، وسأدعوها بالعمليات المثمرة (fruitful methods). المثال الأول هو area، التي تأخذ عدداً عشرياً (double) كمعامل، وتعيد مساحة الدائرة ذات نصف القطر المعطى:
كود:
public static double area (double radius) {
  double area = Math.PI * radius * radius;
  return area;
}
أول شيء عليك ملاحظته هو أن بداية تعريف العملية قد اختلفت. بدلاً من public static void، التي تشير إلى عملية فارغة، توجد public static double، التي تشير إلى أن القيمة المعادة من هذه العملية ستكون من النوع double. لم أشرح معنى public static حتى الآن، تحلى بالصبر.
أيضاً، لاحظ أن السطر الأخير هو شكل آخر لتعليمة return يتضمن قيمة معادة. هذه التعليمة تعني، "ارجع فوراً من هذه العملية واستعمل العبارة التالية كقيمة معادة." العبارة التي تقدمها لتعليمة return يمكن أن تكون معقدة بقدر ما ترغب، لذا كان من الممكن أن نكتب هذه العملية بشكل أكثر اختصاراً:
كود:
public static double area (double radius) {
   return Math.PI * radius * radius;
}
من جهة أخرى، المتغيرات المؤقتة (temporary variables) مثل area غالباً ما تجعل تنقيح الأخطاء أسهل. في كلا الحالتين، يجب أن يوافق نوع العبارة المستخدمة في تعليمة العودة نوع القيمة التي ترجعها العملية. بكلام آخر، عندما تصرح بأن نوع الإرجاع هو double، فإنك تعطي وعداً بأن هذه العملية ستنتج قيمة من نوع double في النهاية. إذا حاولت العودة بدون أي قيمة، أو باستخدام عبارة تنتج قيمة من نوع مخالف، فسيعاقبك المترجم.
أحياناً يكون من المفيد استعمال عدة تعليمات عودة، واحدة في كل فرع من فروع تعليمة شرطية:
كود:
public static double absoluteValue (double x) {
   if (x < 0) {
      return -x;
   } else {
      return x;
   }
}
بما أن تعليمات العودة هذه موجودة في تعليمة شرطية من نمط التنفيذ البديل، سيتم تنفيذ واحدة منها فقط. على الرغم من أن وجود أكثر من تعليمة return في عملية واحدة مشروع، إلا أنك يجب أن تتذكر دائماً أنه بمجرد تنفيذ واحدة منها، سيتم إنهاء العملية بدون تنفيذ أية تعليمات لاحقة.
الشفرة التي تظهر بعد تعليمة return، أو أي مكان آخر لا يمكن أن يتم تنفيذها فيه أبداً، تدعى بالشفرة الميتة (dead code). بعض المجمعات تحذرك في حال وجود جزء ميت في شفرتك.
إذا وضعت تعليمات العودة داخل تعليمات شرطية، فعليك أن تضمن أن كل مسار ممكن للبرنامج ينتهي بتعليمة عودة. مثلاً:
كود:
public static double absoluteValue (double x) {
  if (x < 0) {
    return -x;
  } else if (x > 0) {
    return x;
  }        // WRONG!!
}
هذا البرنامج غير مشروع بسبب وجود الحالة التي يكون فيها x=0، عندها لن يكون أي من الشروط صحيحاً وستنتهي العملية بدون الوصول إلى تعليمة عودة. إن الرسالة الصادرة عن مجمع نموذجي ستكون "مطلوب تعليمة عودة للعملية absoluteValue" —
"return statement required in absoluteValue"، وهي رسالة محيرة إذ أنه يوجد تعليمتي عودة فيها.