English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعليمات أساسيات Java

تحكم العملية في Java

مجموعات Java

Java Object-Oriented (I)

Java Object-Oriented (II)

Java Object-Oriented (III)

معالجة الاستثنائات في Java

قوائم Java (List)

Java Queue (الصف)

مجموعات Java Map

مجموعات Java Set

مدخلات/مخرجات Java (I/O)

قراء/كتابة Java

مواضيع أخرى في Java

معدلات المتغيرات المتغيرة في Java (Varargs)

في هذا المقال، ستتعلم عن طريق الأمثلة كيفية استخدام Varargs في Java. ستعلم أيضًا متى تستخدم Varargs، ومتى لا تستخدمها.

ما هو Varargs في Java؟

افترض أنك تقوم بإنشاءJava methodsلكن، أنت غير متأكد من عدد المعلمات التي ستقبلها طريقةك. لحل هذه المشكلة، قدم Java 1.5 ميزة varargs.

Varargs هي اختصار لـ متغيرات متعددة. في Java، يمكن للدوال أن تأخذ أي عدد من القيم. يُسمى المعامل الذي يمكنه استقبال عدد متغير بالمتغير المتغير.}

الجملة النموذجية لتطبيق varargs هي:

accessModifier methodName(datatype… arg) {
    // جسم الطريقة
}

لإعداد vararg، استخدم ... (نقاط ثلاثة) في معلمات الدالة.

يُسمى إجراءات استقبال عدد متغير إجراءات متغيرات متعددة، أو يُشير إليها ببساطة بـ varargs.

أولاً، دعونا نرى مثالاً بدون استخدام varargs:

class NoVararg {
    public int sumNumber(int a, int b){
        return a+b;
    }
    public int sumNumber(int a, int b, int c){
        return a+b+c;
    }
    public static void main( String[] args ) {
        NoVararg obj = new NoVararg();
        System.out.println(obj.sumNumber(1, 2));
        System.out.println(obj.sumNumber(1, 2, 3));
    }
}

عند تشغيل البرنامج، الناتج سيكون:

3
6

كما ترون، يجب تعريف sumNumber() مرة أخرى لتكون متوافقة مع ثلاثة معلمات.

ماذا إذا كان المستخدم يريد إضافة خمس أرقام أو 10 أو 100؟

استخدام varargs يمكنه معالجة هذه المشكلة بطريقة بسيطة. دعونا نرى مثالاً من البرمجية:

مثال: عرض عمل المتغيرات المتعددة

class VarargExample {
    public int sumNumber(int ... args){
        System.out.println("参数长度: " + args.length);
        int sum = 0;
        for(int x: args){
            sum += x;
        }
        return sum;
    }
    public static void main( String[] args ) {
        VarargExample ex = new VarargExample();
        int sum2 = ex.sumNumber(2, 4);
        System.out.println("sum2 = " + sum2);
        int sum3 = ex.sumNumber(1, 3, 5);
        System.out.println("sum3 = " + sum3);
        int sum4 = ex.sumNumber(1, 3, 5, 7);
        System.out.println("sum4 = " + sum4);
    }
}

运行该程序时,输出为:

طول المعاملات: 2
sum2 = 6
طول المعاملات: 3
sum3 = 9
طول المعاملات: 4
sum4 = 16

في هذا، يعود sumNumber() إلى مجموع المعاملات int التي يتم تمريرها إليه (بغض النظر عن عدد المعاملات المرسلة).

كما ترون، يمكن أن تكون متغيرات متعددة مفيدة في بعض الحالات. ولكن، إذا كنت متأكداً من عدد المعاملات التي يتم تمريرها إلى الطريقة، فاستخدم تحميل الطريقة. على سبيل المثال، إذا كنت متأكداً من أن طريقة sumNumber() تستخدم فقط لحساب مجموع 2 أو 3 معاملات، فاستخدم التحميل كما في المثال الأول.

دعونا نأخذ مثالاً آخر. طريقة format() المحددة في مكتبة Java تقبل متغيرات متعددة. في JDK، يتم تعريف طريقة format() كما يلي:

public static String format(Locale l, String format, Object... args) {
    // جسم
}

مثال: طريقة format()

class Company {
    public static void main(String[] args) {
        String siteName = "oldtoolbag.com";
        int empCount = 6;
        String type = "موقع تعليمي";
        System.out.println(
                String.format(
                        "اسم الموقع: %s، عدد الموظفين: %d، نوع: %s",
                        siteName, empCount, type
                )
        );
    }
}

运行该程序时,输出为:

اسم الموقع: oldtoolbag.com، عدد الموظفين: 6، نوع: موقع تعليمي

كيف تعمل متغيرات متعددة في الخلفية؟

دعونا نرى الشيفرة الوهمية التالية:

public int sumNumber(int ...nums) {
    // جسم الطريقة
}

...نحوية تخبر محول Java يمكنه استخدام معاملات صفر أو أكثر لاستدعاء هذه الطريقة. نتيجة لذلك، يتم إعلان متغير nums بشكل تلقائي كنوع int []جملةلذلك، داخل الطريقة، استخدم جملة مصفوفة لاستدعاء متغير nums.

إذا لم يكن هناك أي معاملات، فإن طول nums هو 0.

تحميل طريقة متغيرات متعددة

مثل الطريقة التقليدية، يمكنك تحميل طريقة متغيرات متعددة.

مثال: تحميل متغيرات متعددة

class VarargOverload {
    private void test(int ... args){
        int sum = 0;
        for (int i: args) {
            sum += i;
        }
        System.out.println("sum = " + sum);
    }
    private void test(boolean p, String ... args){
        boolean negate = !p;
        System.out.println("negate = " + negate);
        System.out.println("args.length = " + args.length);
    }
    public static void main( String[] args ) {
        VarargOverload obj = new VarargOverload();
        obj.test(1, 2, 3);
        obj.test(true, "hello", "world");
    }
}

运行该程序时,输出为:

sum = 6
negate = false
args.length = 2

在上面的程序中,test()方法通过更改其接受的参数数量而重载。

使用 Varargs 时要记住的事情

这是使用Java Varargs时应记住的几件事:

1.在定义方法签名时,请务必保留最后是可变参数。

可变参数必须是传递给方法的最后一个参数。考虑一下,您调用了如下doSomething()方法:

doSomething(1, 2, 3, 4);

并且,您的doSomething()方法定义为:

//错误的方法声明
public void doSomething(int ... nums, int p){
    // method body
}

在这种情况下,编译器无法确定传递给nums的参数数量。

但是,如果将方法定义为:

public void doSomething(int p, int ... nums) {
    // method body
}

Java编译器将第一个参数分配给p,其余int参数分配给nums。

2.一种方法只能有一个可变参数。

例如,此方法声明不正确:

int doSomething(int p, float ... floatNums, double ... doubleNums) {
    // code
}

اللبس في تحميل أساليب Varargs

لننظر في هذا التحميل المزدوج لأسلوب test():

class Demo { 
  
    static void test(int ... vargs) {
        // method body
    }
    
    static void test(int n, int ... vargs) {
        // method body
    }
}

في البرنامج أعلاه، حتى لو حاولت استدعاء أسلوب test()، حتى لو تم تحميله ومقبول عدد مختلف من المعلمات، قد يشعر المحول بالحيرة.

المحول لا يعرف أي أسلوب يجب استدعاؤه. قد يعتقد المحول أنك تحاول استدعاء test(int ... vargs) باستخدام متغير varargs. كما قد يعتقد المحول أنك تحاول استدعاء test(int n, int ... vargs) باستخدام المعلمات المقدمة للمعلمات الأولى، بينما تكون المعلمات الثانية فارغة.

بسبب وجود إثنين من الاحتمالات، قد يحدث لبس. لذلك، قد تحتاج في بعض الأحيان إلى استخدام اسمين مختلفين للأساليب بدلاً من تحميل أساليب varargs.