JavaRush /Java Blogu /Random-AZ /Java varargs

Java varargs

Qrupda dərc edilmişdir
Bu gün Java-da varargs kimi bir şeyi müzakirə edəcəyik. Varargs - və ya Dəyişən Arqumentlər - ixtiyari sayda arqumentlərlə metodlar yaratmağa imkan verən texnologiyadır. Bu yazıda biz bu cür üsulların necə yaradılacağını öyrənəcəyik, vararqların nə üçün lazım olduğunu və onlardan nə vaxt istifadə etməyin ən yaxşı olduğunu müzakirə edəcəyik.

Vararqlar nədir?

Vararqlar dəyişən uzunluqlu arqumentlərdir: JDK5-də görünən xüsusiyyət. Vararqlar bizə ixtiyari sayda arqumentlərlə metodlar yaratmağa imkan verir. Ümumiyyətlə, əvvəllər belə üsulları yaratmaq mümkün idi. Düzdür, bunu etmək o qədər də əlverişli deyildi. Bir misal verək. Tutaq ki, ixtiyari sayda tam arqumentlər götürəcək və onları birləşdirəcək bir üsul yazmalıyıq. Java varargs - 1Bizim iki variantımız var. Seçim 1 - həddindən artıq yükləmə:
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){...};
}
Ancaq həddindən artıq yükləmə ilə bağlı iki problem var. Birincisi, dayanmağın vaxtı həmişə aydın deyil, ikincisi, çətin olur. Massivlər daha yaxşıdır. Seçim 2 - massivlər:
class Calculator {
    int sum(int[] numbers){...};
}
Massivlə bu, artıq çətin deyil və massiv heç kimi görünmür... metodu çağırmaq vaxtı gələnə qədər:
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);
}
Razılaşırıq, əlbəttə ki, hər şeyi daha qısa şəkildə yaza bilərsiniz. Ancaq birincisi, mən yenə də massivlərdən dəyişən uzunluqlu arqumentlər kimi istifadənin əlverişsizliyini nümayiş etdirmək istərdim, ikincisi, belə yazsaq belə:
int[] arguments = {1,10,123,234,6234,12,8};
int sum = calculator.sum(arguments);
Onda biz hələ də həddindən artıq kod miqdarından qurtula bilməyəcəyik. Ancaq Java 5-in buraxılması ilə Varargs funksiyası bu problemləri həll etdi. Bu, ixtiyari sayda arqumentləri üsullara ötürməyə imkan verdi. Bu kimi bir şey görünür:
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();
    }
}
Beləliklə, ümumiləşdirək. Vararqlar dəyişən uzunluqlu arqumentlərdir, bu xüsusiyyət Java 5-in buraxılışı ilə ortaya çıxdı. Sonra biz Varargs ilə işləmək üçün bəzi qaydaları daha ətraflı nəzərdən keçirəcəyik.

Vararqların 5 qaydası

Qayda 1. Vararq arqumenti (və ya dəyişən/ixtiyari uzunluq arqumenti) aşağıdakı kimi ellipslə göstərilir:
String... words
Integer... numbers
Person... people
Cat... cats
Qayda 2. İxtiyari uzunluqlu arqument yalnız hansısa metodun arqumenti kimi göstərilə bilər:
void print(String... words)
int sum(Integer... numbers)
void save(Person... people)
void feed(Cat... cats)
Qayda 3. Metodun gövdəsindəki hər bir belə dəyişən uzunluqlu arqument massivdir:
void print(String... words){
    for (int i = 0; i < words.length; i++) {
        System.out.println(words[i]);
    }
}
Qayda 4. Vararq arqumenti metod arqumentləri siyahısında sonuncu olmalıdır:
void print(String... words, String anotherWord) // - Так нельзя!
void print(String... words, int someNumber) // - Так нельзя!

void print(String anotherWord, String... words) // - Так можно
void print(int someNumber, String... words) // - Так можно
Qayda 5: Vararqlar massiv olsa da, dəyişən uzunluqlu arqumentlər götürən metodu çağırarkən massiv yaratmaq lazım deyil. Lazım olan arqumentləri vergüllə ayırmaq kifayətdir və hətta arzuolunandır:
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]);
        }
    }
}

Vararqların nümunələri

Aşağıdakı nümunədə tam ədədlərdən ibarət vararqları götürən və keçən elementlərin sayını və onların cəmini göstərən bir üsul yazacağıq. Bu metoda həm massiv, həm də tam ədədlər seriyasını keçirək (hər iki seçim etibarlıdır):
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);
}
Proqramı işə saldıqdan sonra nəticə çıxaracaq:

Кол-во элементов для сложения - 100, сумма - 4950 
Кол-во элементов для сложения - 10, сумма - 55 
Qeyd etmək lazımdır ki, metod System.out.printfhəm də vararqları qəbul edir. Bu metodun koduna baxsaq, bunu görərik:
public PrintStream printf(String format, Object ... args) {
    return format(format, args);
}
Varagları qəbul edən başqa bir geniş istifadə olunan üsuldur String.format. Onun kodu aşağıda göstərilir:
public static String format(String format, Object... args) {
    return new Formatter().format(format, args).toString();
}

Varargs nə vaxt istifadə edilməlidir?

Bu sualın cavabı kimin soruşmasından asılıdır. Bənzər bir sual varargs ilə üsulları olan bəzi API müştərisi tərəfindən verilərsə, cavab "bu cür üsullardan mümkün qədər tez-tez istifadə edin" olacaq. Kod müştərisi üçün varargs kodu yazmağı asanlaşdıraraq və daha oxunaqlı etməklə həyatı çox asanlaşdırır. Bununla belə, bu sualı varargs ilə nə qədər tez-tez metodlar yaratmağınızla maraqlanan bir API tərtibçisi soruşsa, cavab "varargları tez-tez istifadə etməməlisiniz" olacaq. Varargs yalnız onun istifadəsinin faydası açıq olduqda istifadə edilməlidir. Siz həmçinin vararglarla metodların həddən artıq yüklənməsindən qaçınmalısınız, çünki bu, kodunuzun müştərilərinə həddən artıq yüklənmiş metodlardan hansının əslində çağırıldığını başa düşməyi çətinləşdirəcək.

Nəticə

Beləliklə, biz Java-da varargs adlı başqa bir mövzunu əhatə etdik. Bunun nə olduğunu anladıq. Biz vararqlardan istifadə qaydalarını təsvir etdik. Biz ixtiyari uzunluq arqumentləri olan üsulların nümunələrinə baxdıq, həmçinin vararqlardan nə vaxt istifadə etməyin daha yaxşı olduğunu və onlardan istifadə etməkdən çəkinməyin daha yaxşı olduğunu müzakirə etdik. Ev tapşırığı olaraq aşağıdakı üsulları həyata keçirə bilərsiniz:
  • voidBir sıra tam ədədlər götürən və onların arifmetik ortasını qaytaran üsul yazın .
  • voidBir sıra sətirləri götürən və ən uzun sözü çap edən üsul yazın .
  • booleanQaytaran və ilk arqument kimi bir növ dəyişəni String, booleannövbəti arqument kimi isə bir sıra dəyişən uzunluğu alan metod yazın .
    Mümkün Stringdəyərlər AND, OR, XOR. Birinci arqumentin başqa bir dəyəri varsa, metod bir istisna atmalıdır IllegalArgumentException.
    Metod varargs arqumentinin hər bir elementi üzərində məntiqi əməliyyatı (birinci arqumentdə göstərilmişdir) yerinə yetirməli və hesablamanın nəticəsini qaytarmalıdır.
Nümunə arqumentlər və nəticə:
  • "VƏ", doğru, doğru, yalan - yalan qaytaracaq
  • "YA", yalan, doğru, yalan, yalan - doğru qayıdacaq
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION