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

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