جاوا varargs

در گروه منتشر شد
امروز ما در مورد چیزی به عنوان varargs در جاوا بحث خواهیم کرد. Varargs - یا Variable Arguments - فناوری است که به شما امکان می دهد روش هایی را با تعداد دلخواه آرگومان ایجاد کنید. در این مقاله، نحوه ایجاد چنین روش‌هایی را یاد می‌گیریم، در مورد چرایی نیاز به vararg و بهترین زمان استفاده از آنها بحث خواهیم کرد.

Varargs چیست؟

Varargs آرگومان هایی با طول متغیر هستند: ویژگی که در JDK5 ظاهر شد. Varargs به ما اجازه می دهد تا روش هایی را با تعداد دلخواه آرگومان ایجاد کنیم. به طور کلی، امکان ایجاد چنین روش هایی قبلا وجود داشت. درست است، انجام این کار خیلی راحت نبود. بیایید یک مثال بزنیم. فرض کنید باید روشی بنویسیم که تعداد دلخواه آرگومان های عدد صحیح را بگیرد و آنها را با هم جمع کند. جاوا 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);
سپس ما هنوز از شر مقدار بیش از حد کد خلاص نخواهیم شد. با این حال، با انتشار جاوا 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 آرگومان‌هایی با طول متغیر هستند، ویژگی‌ای که با انتشار جاوا 5 ظاهر شد. در ادامه، نگاهی دقیق‌تر به برخی از قوانین کار با Varargs خواهیم داشت.

5 قانون وارگ

قانون 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: با وجود اینکه vararg ها آرایه هستند، هنگام فراخوانی متدی که آرگومان های با طول متغیر را می گیرد، نیازی به ایجاد آرایه نیست. کافی و حتی مطلوب است که به سادگی آرگومان های مورد نیاز را که با کاما از هم جدا شده اند فهرست کنید:
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]);
        }
    }
}

نمونه هایی از واررگ ها

در مثال زیر روشی می نویسیم که متغیرهای متشکل از اعداد صحیح را می گیرد و تعداد عناصر ارسال شده و مجموع آنها را نمایش می دهد. بیایید هم یک آرایه و هم یک سری اعداد صحیح را به این متد ارسال کنیم (هر دو گزینه معتبر هستند):
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.printfvarargs را نیز می پذیرد. اگر به کد این متد نگاه کنیم، این را خواهیم دید:
public PrintStream printf(String format, Object ... args) {
    return format(format, args);
}
یکی دیگر از روش های پرکاربرد که Varag ها را می پذیرد String.format، . کد آن در زیر نشان داده شده است:
public static String format(String format, Object... args) {
    return new Formatter().format(format, args).toString();
}

چه زمانی از varargs استفاده کنیم؟

پاسخ به این سوال بستگی به این دارد که چه کسی سوال می کند. اگر یک سؤال مشابه توسط مشتری برخی از APIها که متدهایی با vararg دارد، پرسیده شود، پاسخ این خواهد بود: «تا حد امکان از چنین روش‌هایی استفاده کنید». برای کلاینت کد، varargs با آسان‌تر کردن نوشتن و خواندن کد، زندگی را بسیار آسان‌تر می‌کند. با این حال، اگر این سوال توسط یک توسعه دهنده API پرسیده شود که متعجب است که چند وقت یکبار باید متدهایی با varargs ایجاد کنید، پاسخ این خواهد بود که "شما نباید اغلب از varargs استفاده کنید." Varargs فقط زمانی باید استفاده شود که مزایای استفاده از آن آشکار باشد. همچنین باید از بارگذاری بیش از حد متدها با varargs خودداری کنید، زیرا این کار باعث می‌شود که مشتریان کد شما درک کنند که کدام یک از متدهای بارگذاری شده واقعاً نامیده می‌شوند.

نتیجه

بنابراین، ما موضوع دیگری را پوشش داده ایم، varargs در جاوا. فهمیدیم چیه قوانین استفاده از varargs را شرح دادیم. ما به نمونه‌هایی از روش‌ها با آرگومان‌های طول دلخواه نگاه کردیم، و همچنین در مورد اینکه چه زمانی بهتر است از varargs استفاده کنیم و چه زمانی بهتر است از استفاده از آنها خودداری کنیم. به عنوان تکلیف، می توانید روش های زیر را پیاده سازی کنید:
  • voidروشی بنویسید که یک سری اعداد صحیح را بگیرد و میانگین حسابی آنها را برگرداند.
  • voidروشی بنویسید که یک سری رشته ها را بگیرد و طولانی ترین کلمه را چاپ کند.
  • متدی بنویسید که برمی گرداند booleanو یک متغیر از نوع را به عنوان آرگومان اول Stringو یک سری booleanاز طول متغیر را به عنوان آرگومان بعدی دریافت می کند.
    مقادیر ممکن Stringعبارتند از AND, OR, XOR. اگر آرگومان اول مقدار دیگری داشته باشد، متد باید یک استثنا ایجاد کند IllegalArgumentException.
    متد باید یک عملیات منطقی (که در آرگومان اول مشخص شده است) روی هر عنصر آرگومان varargs انجام دهد و نتیجه محاسبه را برگرداند.
نمونه استدلال و نتیجه:
  • "AND"، درست، درست، نادرست - نادرست برمی گردد
  • "OR"، false، true، false، false - درست برمی گردد
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION