JavaRush /مدونة جافا /Random-AR /جافا فارارجس

جافا فارارجس

نشرت في المجموعة
سنناقش اليوم شيئًا مثل varargs في Java. Varargs - أو الوسائط المتغيرة - هي تقنية تسمح لك بإنشاء طرق بعدد عشوائي من الوسائط. في هذه المقالة، سنتعلم كيفية إنشاء مثل هذه الأساليب، ومناقشة سبب الحاجة إلى varargs ومتى يكون من الأفضل استخدامها.

ما هي فارارجس؟

Varargs هي وسائط متغيرة الطول: وهي ميزة ظهرت في JDK5. تتيح لنا Varargs إنشاء طرق بعدد عشوائي من الوسائط. بشكل عام، كان من الممكن إنشاء مثل هذه الأساليب من قبل. صحيح أن القيام بذلك لم يكن مريحًا للغاية. دعونا نعطي مثالا. لنفترض أننا بحاجة إلى كتابة طريقة تأخذ عددًا عشوائيًا من وسيطات الأعداد الصحيحة وتجمعها معًا. جافا فارارجس - 1لدينا خياران. الخيار 1 - التحميل الزائد:
class Calculator {
    int sum(int a, int b){...};
    int sum(int a, int b, int c){...};
    int sum(int a, int b, int c, int d){...};
    int sum(int a, int b, int c, int d, int e){...};
}
ولكن هناك مشكلتان مع التحميل الزائد. أولاً، ليس من الواضح دائمًا متى يحين وقت التوقف، وثانيًا، إنه أمر مرهق. المصفوفات أفضل. الخيار 2 - المصفوفات:
class Calculator {
    int sum(int[] numbers){...};
}
مع المصفوفة، لم يعد الأمر مرهقًا، ويبدو أن المصفوفة لا تبدو وكأنها لا شيء... حتى يحين وقت استدعاء الطريقة:
public static void main(String... sss) {
    Calculator calculator = new Calculator();

    int[] arguments = new int[7];
    arguments[0] = 1;
    arguments[1] = 10;
    arguments[2] = 123;
    arguments[3] = 234;
    arguments[4] = 6234;
    arguments[5] = 12;
    arguments[6] = 8;

    int sum = calculator.sum(arguments);
}
نحن نتفق، يمكنك، بالطبع، كتابة كل شيء لفترة وجيزة. لكن أولاً، ما زلت أرغب في توضيح الإزعاج الناتج عن استخدام المصفوفات كوسيطات ذات أطوال متغيرة، وثانيًا، حتى لو كتبناها على النحو التالي:
int[] arguments = {1,10,123,234,6234,12,8};
int sum = calculator.sum(arguments);
ثم ما زلنا لا نستطيع التخلص من الكمية الزائدة من التعليمات البرمجية. ومع ذلك، مع إصدار Java 5، ظهرت ميزة Varargs لحل هذه المشكلات. لقد جعل من الممكن تمرير عدد عشوائي من الوسائط إلى الأساليب. يبدو شيء من هذا القبيل:
public class Calculator {
    public static void main(String... sss) {
        Calculator calculator = new Calculator();
        int sum = calculator.sum(1,10,123,234,6234,12,8);
    }
    int sum(int... numbers){
       return Arrays.stream(numbers).sum();
    }
}
لذلك، دعونا نلخص. Varargs هي وسيطات ذات طول متغير، وهي ميزة ظهرت مع إصدار Java 5. بعد ذلك، سنلقي نظرة فاحصة على بعض قواعد العمل مع Varargs.

5 قواعد varargs

القاعدة 1. تتم الإشارة إلى وسيطة Vararg (أو وسيطة الطول المتغير/التعسفي) بواسطة علامات الحذف كما يلي:
String... words
Integer... numbers
Person... people
Cat... cats
القاعدة 2. لا يمكن تحديد وسيطة ذات طول تعسفي إلا كوسيطة لبعض الطرق:
void print(String... words)
int sum(Integer... numbers)
void save(Person... people)
void feed(Cat... cats)
القاعدة 3. كل وسيطة ذات طول متغير في نص الطريقة هي مصفوفة:
void print(String... words){
    for (int i = 0; i < words.length; i++) {
        System.out.println(words[i]);
    }
}
القاعدة 4. يجب أن تكون الوسيطة Vararg هي الأخيرة في قائمة وسيطات الطريقة:
void print(String... words, String anotherWord) // - Так нельзя!
void print(String... words, int someNumber) // - Так нельзя!

void print(String anotherWord, String... words) // - Так можно
void print(int someNumber, String... words) // - Так можно
القاعدة 5: على الرغم من أن varargs هي مصفوفات، عند استدعاء أسلوب يأخذ وسائط متغيرة الطول، فإنه ليس من الضروري إنشاء مصفوفة. يكفي بل ومن المرغوب فيه ببساطة إدراج الوسائط المطلوبة مفصولة بفواصل:
public class Main {
    public static void main(String... sss) {
        print("How","же","прекрасно","изучать","Java");
    }

    static void print(String... words){
        for (int i = 0; i < words.length; i++) {
            System.out.println(words[i]);
        }
    }
}

أمثلة على فارارج

في المثال أدناه، سنكتب طريقة تأخذ varargs مكونة من أعداد صحيحة وتعرض عدد العناصر التي تم تمريرها ومجموعها. دعنا نمرر مصفوفة وسلسلة من الأعداد الصحيحة إلى هذه الطريقة (كلا الخيارين صالحان):
public static void main(String... sss) {
    int[] a = new int[100];
    for (int i = 0; i < a.length; i++) {
        a[i] = i;
    }

    sum(a);
    sum(1,2,3,4,5,6,7,8,9,10);
}

static void sum(int... numbers){
    final int length = numbers.length;
    final int sum = Arrays.stream(numbers).sum();
    final String lineSeparator = System.lineSeparator();

    System.out.printf("Кол-во элементов для сложения - %d, сумма - %d%s", length, sum, lineSeparator);
}
بعد تشغيل البرنامج سيخرج:

Кол-во элементов для сложения - 100, сумма - 4950 
Кол-во элементов для сложения - 10, сумма - 55 
ومن الجدير بالذكر أن الطريقة System.out.printfتقبل أيضًا varargs. وإذا نظرنا إلى كود هذه الطريقة فسنرى ما يلي:
public PrintStream printf(String format, Object ... args) {
    return format(format, args);
}
هناك طريقة أخرى مستخدمة على نطاق واسع والتي تقبل varags وهي String.format. يظهر الكود الخاص به أدناه:
public static String format(String format, Object... args) {
    return new Formatter().format(format, args).toString();
}

متى تستخدم varargs؟

الجواب على هذا السؤال يعتمد على من يسأل. إذا تم طرح سؤال مماثل من قبل عميل بعض واجهات برمجة التطبيقات (API) التي لديها طرق مع varargs، فستكون الإجابة "استخدم هذه الأساليب كلما كان ذلك ممكنًا". بالنسبة لعميل التعليمات البرمجية، فإن varargs يجعل الحياة أسهل كثيرًا من خلال جعل التعليمات البرمجية أسهل في الكتابة وأكثر قابلية للقراءة. ومع ذلك، إذا تم طرح هذا السؤال من قبل أحد مطوري واجهة برمجة التطبيقات (API) الذي يتساءل عن عدد المرات التي يجب عليك فيها إنشاء طرق باستخدام varargs، فستكون الإجابة "يجب ألا تستخدم varargs كثيرًا". يجب استخدام Varargs فقط عندما تكون فائدة استخدامه واضحة. يجب عليك أيضًا تجنب التحميل الزائد للطرق باستخدام varargs، لأن هذا سيجعل من الصعب على عملاء الكود الخاص بك فهم أي من الطرق المحملة بشكل زائد يتم استدعاؤها بالفعل.

خاتمة

لذلك، قمنا بتغطية موضوع آخر، varargs في جافا. لقد اكتشفنا ما هو عليه. وصفنا قواعد استخدام varargs. لقد نظرنا إلى أمثلة للطرق ذات الوسائط الطولية العشوائية، وناقشنا أيضًا متى يكون من الأفضل استخدام varargs ومتى يكون من الأفضل الامتناع عن استخدامها. كواجب منزلي، يمكنك تنفيذ الطرق التالية:
  • اكتب voidعملية تأخذ سلسلة من الأعداد الصحيحة وترجع وسطها الحسابي.
  • اكتب voidطريقة تأخذ سلسلة من السلاسل وتطبع أطول كلمة.
  • اكتب عملية تقوم بإرجاع booleanمتغير من النوع باعتباره الوسيط الأول String، وسلسلة booleanمن المتغير الطول باعتباره الوسيط التالي. القيم
    المحتملة Stringهي AND, OR. XORإذا كانت الوسيطة الأولى لها قيمة أخرى، فيجب أن تطرح الطريقة استثناءً IllegalArgumentException.
    يجب أن تقوم الطريقة بإجراء عملية منطقية (المحددة في الوسيطة الأولى) على كل عنصر من عناصر الوسيطة varargs وإرجاع نتيجة الحساب.
أمثلة على الحجج والنتيجة:
  • "و"، صحيح، صحيح، خطأ - سيعود خطأ
  • "OR"، خطأ، صحيح، خطأ، خطأ - سيعود صحيحًا
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION