ماهي خاصية 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 موضوع قوي ويوفر ديناميكية كبيرة في التعامل مع الدوال .