ماهي خاصية vararage ؟
هل سبق وتعاملت مع دالة printf في جافا ؟ هل تسالت من طريقة برمجتها ، وكيف تستطيع استقبال الكثير من الوسائط ؛ الاجابة عن هذا التساؤل هي خاصية vararage  .

احدى الخصائص المميزة والقوية في لغة الجافا ، وتوجد في لغات اخرى ايضاً .

  • تمنح هذه الخاصية القدرة على ارسال عدد لا نهائي من الوسائط (parameters)الى الدالة ويتم استخدامها كالتالي :
static int sum(int ... nums){
    int sum = 0;
    for(int i = 0; i < nums.length; i++){
        sum += nums[i];
    }
    return sum;
}

حيث قمنا باضافة الثلاث النقاط (...) ما بين نوع المتغير الوسيط (parameter) nums و اسمه ؛ لاحظ اننا نتعامل مع المتغير الوسيط nums كمصفوفة .
يمكن استعمال الدالة السابقة وتمرير لها اي عدد من الوسائط ، الحالات التالية جميعها صحيحة :

System.out.println(sum(10));
System.out.println(sum(10,20));
System.out.println(sum(10,20,30));

ويمكن تمرير عدد لا نهائي من الوسائط الى الدالة .

هل يمكن تمرير وسائط مختلفة الانواع ؟
الاجابة هي لا ، ولا يمكن ايضاً تمرير اكثر من vararage في نفس الوقت الكود التالي غير صحيح :

static void vara(int ...v1, String ...v2){}

إذا لا يمكن تمرير اكثر من vararage في وقت واحد ، لكن ماذا عن دالة printf التي تحدثنا عنها ، فهي تستقبل في البداية نصاً(String) ثم تستقبل انواع مختلفة قد تكون ارقاماً او نصوصاً ؟!
دعني اوضح لك الاجابة على قسمين ، القسم الاول هو كيف اجعلها تستقبل في البداية نصاً اجبارياً والمثال التالي يوضح ذلك :

static void myPrintf(String first, int ... vara){}

لاحظ اننا قمنا بارسال وسيط ثابت (ليس vararage ) قبل ارسال ال vararage وهذا مقبول في جافا ، والكود سيعمل بدون مشاكل .
حللنا الجزء الاول من المشكلة ، تبقى كيف نرسل انواع مختلفة من البيانات في ال vararage  ، الامر بسيط جدا ، فلغة جافا هي كائينية التوجه وكل فئاتها (classes) ترث من الفئة الام وهي Object ، لذلك تعديل الكود السابق سيكون كالتالي :

static void myPrintf(String first, Object ... vara){}

هذا الكود يشبه بالضبط كود تعريف دالة

System.out.printf();

ملاحظة اخيرة عن vararage :
اذا كان لدينا دالة تستقبل vararage كالتالي :

static int sum(int ... nums){
    int sum = 0;
    for(int i = 0; i < nums.length; i++){
        sum += nums[i];
    }
    return sum;
}

فيمكن استخدامها بطريقتين ، الطريقة الاولى شرحتها في الموضوع السابق والطريقة الثانية هي بتمرير مصفوفة قيم جاهزة اليها كالتالي :

int[] array = new int[]{10, 20, 30, 50};
int total = sum(array);

في النهاية ، موضوع ال vararage موضوع قوي ويوفر ديناميكية كبيرة في التعامل مع الدوال .