معاملات Varargs
عرّف أساليب تقبل قوائم معاملات متغيرة الطول وادمجها مع المصفوفات
معاملات Varargs درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
المعاملات متغيرة العدد
تتيح لك المعاملات متغيرة العدد (قوائم الوسائط ذات الطول المتغير) تعريف أساليب تقبل أي عدد من الوسائط من النوع نفسه، وتُعامل داخليًا على أنها مصفوفة.
تعريف المعاملات متغيرة العدد
استخدم Type... name لتعريف معامل متغير العدد. يجب أن يكون هذا المعامل الأخير، ولا يمكن أن يوجد أكثر من معامل واحد منه في الأسلوب.
static int sum(int... numbers) {
int total = 0;
for (int n : numbers) total += n;
return total;
}
System.out.println(sum()); // 0 (empty array)
System.out.println(sum(1)); // 1
System.out.println(sum(1, 2, 3)); // 6
System.out.println(sum(1, 2, 3, 4)); // 10
// Can also pass an array
int[] arr = {5, 10, 15};
System.out.println(sum(arr)); // 30المعاملات متغيرة العدد داخليًا
المعاملات متغيرة العدد مجرد صياغة مُيسَّرة. يحوّل المترجم الاستدعاء إلى إنشاء مصفوفة في موضع الاستدعاء.
// Calling: sum(1, 2, 3)
// Compiler generates: sum(new int[]{1, 2, 3})
static void printAll(String label, String... items) {
System.out.println(label + ":");
for (String item : items) System.out.println(" - " + item);
}
printAll("Fruits", "Apple", "Banana", "Cherry");
// Fruits:
// - Apple
// - Banana
// - Cherry
printAll("Empty"); // varargs is empty arrayالمعاملات المختلطة مع المعاملات متغيرة العدد
يجب أن يكون معامل العدد المتغير هو المعامل الأخير. ويمكنك وضع معاملات عادية قبله.
static double average(String label, double... values) {
if (values.length == 0) return 0.0;
double sum = 0;
for (double v : values) sum += v;
double avg = sum / values.length;
System.out.printf("%s average: %.2f%n", label, avg);
return avg;
}
average("Math scores", 92.0, 85.5, 78.0, 95.0);
// Math scores average: 87.62
average("Single value", 100.0);
// Single value average: 100.00المعاملات متغيرة العدد مع الأنواع العامة
يؤدي استخدام المعاملات متغيرة العدد مع الأنواع العامة إلى ظهور تحذير تلوث الكومة. استخدم @SafeVarargs لإخفاء التحذير عندما يكون الأسلوب آمنًا بشكل مؤكد.
import java.util.Arrays;
import java.util.List;
@SafeVarargs // suppresses heap pollution warning
static <T> List<T> listOf(T... elements) {
return Arrays.asList(elements); // safe: we don't store to the array
}
List<String> names = listOf("Alice", "Bob", "Charlie");
System.out.println(names); // [Alice, Bob, Charlie]
List<Integer> scores = listOf(95, 87, 73);
System.out.println(scores); // [95, 87, 73]المعاملات متغيرة العدد والتحميل الزائد
عند وجود تحميل زائد لأسلوب ذي معاملات متغيرة العدد مع تطابق تام، يُفضَّل التطابق التام. ولا تُستخدم المعاملات متغيرة العدد إلا كخيار أخير.
static void log(String msg) { System.out.println("1-arg: " + msg); }
static void log(String m1, String m2) { System.out.println("2-arg: " + m1 + ", " + m2); }
static void log(String... msgs) { System.out.println("varargs: " + msgs.length); }
log("hello"); // 1-arg: hello
log("a", "b"); // 2-arg: a, b
log("a", "b", "c"); // varargs: 3
log(); // varargs: 0printf يستخدم معاملات متغيرة العدد
يستخدم System.out.printf معاملات متغيرة العدد — فهو يقبل سلسلة تنسيق وأي عدد من الوسائط من أي نوع.
// printf signature: printf(String format, Object... args)
System.out.printf("%s ordered %d items for $%.2f%n",
"Alice", 3, 59.97);
// Alice ordered 3 items for $59.97
// String.format is also varargs
String msg = String.format("Error %d: %s", 404, "Not Found");
System.out.println(msg); // Error 404: Not Foundإنشاء مسجّل باستخدام معاملات متغيرة العدد
تنفيذ مسجّل بسيط ومنظَّم يقبل أزواج المفتاح والقيمة باستخدام معاملات متغيرة العدد.
static void logEvent(String event, Object... keyValues) {
if (keyValues.length % 2 != 0)
throw new IllegalArgumentException("Key-value pairs required");
StringBuilder sb = new StringBuilder(event);
for (int i = 0; i < keyValues.length; i += 2)
sb.append(" ").append(keyValues[i]).append("=").append(keyValues[i+1]);
System.out.println(sb);
}
logEvent("user.login", "userId", 42, "ip", "192.168.1.1", "success", true);
// user.login userId=42 ip=192.168.1.1 success=trueاعتبارات الأداء
ينشئ كل استدعاء يستخدم معاملات متغيرة العدد مصفوفة جديدة في الكومة. ولتجنّب التخصيص في أساليب الأدوات كثيرة الاستدعاء، وفّر أساليب تحميل زائد بعدد ثابت من المعاملات.
// Java's own EnumSet does this:
static <E extends Enum<E>> EnumSet<E> of(E e) { ... }
static <E extends Enum<E>> EnumSet<E> of(E e1, E e2) { ... }
static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3) { ... }
static <E extends Enum<E>> EnumSet<E> of(E e1, E... rest) { ... }
// Avoids array creation for 1-3 args (most common case)
// Apply the same pattern to your own hot-path APIs:
static void report(String msg) { log(new String[]{msg}); }
static void report(String m1, String m2) { log(new String[]{m1, m2}); }
static void report(String... msgs) { log(msgs); }المعاملات متغيرة العدد وnull
يؤدي تمرير null إلى أسلوب ذي معاملات متغيرة العدد إلى غموض — فقد تفسّره Java على أنه مصفوفة قيمتها null. استخدم تحويلًا صريحًا لتجنّب التحذير.
static void printItems(String... items) {
if (items == null) {
System.out.println("null array passed");
return;
}
for (String item : items)
System.out.println(item != null ? item : "(null element)");
}
printItems((String[]) null); // null array passed
printItems(null, "valid"); // (null element), valid
printItems(); // empty array (0 items)تطبيقي: أداة مساعدة لتنسيق String
غلاف آمن لـ printf يعيد السلسلة المنسَّقة، ويستخدم معاملات متغيرة العدد لمحاكاة أسلوب format-args.
static String fmt(String pattern, Object... args) {
try {
return String.format(pattern, args);
} catch (java.util.IllegalFormatException e) {
return "[FORMAT ERROR: " + e.getMessage() + "]";
}
}
System.out.println(fmt("User %s has %d orders", "Alice", 5));
// User Alice has 5 orders
System.out.println(fmt("Invalid %z format", "arg"));
// [FORMAT ERROR: Conversion = 'z' ...]تحقق سريع
ما نوع معامل العدد المتغير داخل جسم الأسلوب؟
مراجعة: المعاملات متغيرة العدد
أهم النقاط:
- يقبل معامل العدد المتغير (Type... name) صفرًا أو أكثر من الوسائط، ويتعامل معها داخليًا على أنها مصفوفة
- يجب أن يكون المعامل الأخير — ولا يمكن أن يوجد أكثر من معامل واحد متغير العدد في الأسلوب
- يمكن للجهة المستدعية تمرير قيم فردية أو مصفوفة
- استخدم @SafeVarargs لإخفاء تحذيرات تلوث الكومة الناتجة عن المعاملات العامة متغيرة العدد
- تُفضَّل أساليب التحميل الزائد ذات التطابق التام على الأساليب ذات المعاملات متغيرة العدد
- وفّر أساليب تحميل زائد بعدد ثابت من المعاملات للأساليب كثيرة الاستدعاء لتجنّب تخصيص المصفوفات
تعلم Java مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 104
- الدروس
- 374
الأسئلة الشائعة
هل درس «معاملات Varargs» مجاني؟
نعم — نص درس «معاملات Varargs» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «معاملات Varargs»؟
عرّف أساليب تقبل قوائم معاملات متغيرة الطول وادمجها مع المصفوفات تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «معاملات Varargs»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- قواعد تحميل الأساليب الزائد
- معاملات Varargs
- الحقول والثوابت الثابتة
- فئات الأدوات وأساليب المصنع الثابتة