JavaRush /Java blogi /Random-UZ /Java variantlari

Java variantlari

Guruhda nashr etilgan
Bugun biz Java-da vararglar kabi narsalarni muhokama qilamiz. Varargs - yoki o'zgaruvchan argumentlar - bu ixtiyoriy miqdordagi argumentlar bilan usullarni yaratishga imkon beruvchi texnologiya. Ushbu maqolada biz bunday usullarni qanday yaratishni o'rganamiz, nima uchun vararglar kerakligini va ularni qachon ishlatish yaxshiroq ekanligini muhokama qilamiz.

Vararglar nima?

Vararglar o'zgaruvchan uzunlikdagi argumentlardir: JDK5 da paydo bo'lgan xususiyat. Vararglar bizga ixtiyoriy sonli argumentlar bilan usullarni yaratishga imkon beradi. Umuman olganda, ilgari bunday usullarni yaratish mumkin edi. To'g'ri, buni qilish juda qulay emas edi. Keling, misol keltiraylik. Aytaylik, biz ixtiyoriy sonli butun son argumentlarini oladigan va ularni qo‘shadigan usul yozishimiz kerak. Java vararglari - 1Bizda ikkita variant bor. Variant 1 - ortiqcha yuk:
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){...};
}
Ammo ortiqcha yuk bilan bog'liq ikkita muammo mavjud. Birinchidan, qachon to'xtash vaqti kelgani har doim ham aniq emas, ikkinchidan, bu mashaqqatli. Massivlar yaxshiroq. Variant 2 - massivlar:
class Calculator {
    int sum(int[] numbers){...};
}
Massiv bilan u endi qiyin emas va massiv hech narsaga o'xshamaydi... usulni chaqirish vaqti kelguncha:
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);
}
Biz rozimiz, siz, albatta, hamma narsani qisqacha yozishingiz mumkin. Lekin, birinchidan, men massivlarni o'zgaruvchan uzunlikdagi argumentlar sifatida ishlatishning noqulayligini va ikkinchidan, agar biz buni shunday yozsak ham ko'rsatmoqchiman:
int[] arguments = {1,10,123,234,6234,12,8};
int sum = calculator.sum(arguments);
Shunda biz hali ham ortiqcha kod miqdoridan qutula olmaymiz. Biroq, Java 5-ning chiqarilishi bilan Varargs xususiyati bu muammolarni hal qilish uchun paydo bo'ldi. Bu usullarga ixtiyoriy sonli argumentlarni o'tkazish imkonini berdi. Bu shunday ko'rinadi:
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();
    }
}
Shunday qilib, keling, xulosa qilaylik. Vararglar o'zgaruvchan uzunlikdagi argumentlar bo'lib, Java 5-ning chiqarilishi bilan paydo bo'lgan xususiyatdir. Keyin biz Varargs bilan ishlashning ba'zi qoidalarini batafsil ko'rib chiqamiz.

Vararglarning 5 ta qoidalari

1-qoida. Vararg argumenti (yoki o‘zgaruvchi/ixtiyoriy uzunlik argumenti) quyidagi tarzda ellips bilan ko‘rsatilgan:
String... words
Integer... numbers
Person... people
Cat... cats
2-qoida. Ixtiyoriy uzunlikdagi argument faqat ba'zi metodlarga argument sifatida ko'rsatilishi mumkin:
void print(String... words)
int sum(Integer... numbers)
void save(Person... people)
void feed(Cat... cats)
3-qoida. Usul tanasidagi har bir bunday o‘zgaruvchan uzunlikdagi argument massiv hisoblanadi:
void print(String... words){
    for (int i = 0; i < words.length; i++) {
        System.out.println(words[i]);
    }
}
4-qoida. Vararg argumenti metod argumentlari roʻyxatida oxirgi boʻlishi kerak:
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-qoida: Garchi vararglar massiv bo'lsa ham, o'zgaruvchan uzunlikdagi argumentlarni oladigan usulni chaqirganda, massiv yaratish shart emas. Kerakli dalillarni vergul bilan ajratib ko'rsatish kifoya va hatto maqsadga muvofiqdir:
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]);
        }
    }
}

Vararglarga misollar

Quyidagi misolda biz butun sonlardan tashkil topgan vararglarni oladigan va o'tkazilgan elementlar sonini va ularning yig'indisini ko'rsatadigan usul yozamiz. Keling, massivni ham, butun sonlar qatorini ham ushbu usulga o‘tkazamiz (ikkala variant ham amal qiladi):
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);
}
Dasturni ishga tushirgandan so'ng quyidagilar chiqadi:

Кол-во элементов для сложения - 100, сумма - 4950 
Кол-во элементов для сложения - 10, сумма - 55 
Shuni ta'kidlash kerakki, usul System.out.printfvararglarni ham qabul qiladi. Agar biz ushbu usulning kodini ko'rib chiqsak, buni ko'ramiz:
public PrintStream printf(String format, Object ... args) {
    return format(format, args);
}
Varaglarni qabul qiladigan yana bir keng tarqalgan usul String.format. Uning kodi quyida ko'rsatilgan:
public static String format(String format, Object... args) {
    return new Formatter().format(format, args).toString();
}

Vararglarni qachon ishlatish kerak?

Bu savolga javob kim so'raganiga bog'liq. Agar shunga o'xshash savolni vararglar bilan usullarga ega bo'lgan ba'zi bir API mijozi so'rasa, javob "bunday usullardan iloji boricha tez-tez foydalaning" bo'ladi. Kod mijozi uchun varargs kodni yozishni va o'qishni osonlashtirib, hayotni ancha osonlashtiradi. Biroq, agar bu savolni vararglar bilan qanchalik tez-tez usullarni yaratish kerakligi haqida savol tug'diradigan API ishlab chiquvchisi so'rasa, javob "siz tez-tez vararglardan foydalanmasligingiz kerak" bo'ladi. Vararglarni faqat foydalanishning foydasi aniq bo'lganda qo'llash kerak. Siz shuningdek, vararglar bilan usullarni ortiqcha yuklashdan qochishingiz kerak, chunki bu sizning kodingiz mijozlariga haddan tashqari yuklangan usullardan qaysi biri aslida chaqirilganligini tushunishni qiyinlashtiradi.

Xulosa

Shunday qilib, biz yana bir mavzuni ko'rib chiqdik, Java'da varargs. Biz nima ekanligini aniqladik. Biz vararglardan foydalanish qoidalarini tasvirlab berdik. Biz ixtiyoriy uzunlik argumentlari bo'lgan usullarning misollarini ko'rib chiqdik, shuningdek, vararglardan qachon foydalanish yaxshiroq va qachon ulardan foydalanishdan voz kechish yaxshiroq ekanligini muhokama qildik. Uy vazifasi sifatida siz quyidagi usullarni qo'llashingiz mumkin:
  • voidButun sonlar qatorini oladigan va ularning oʻrtacha arifmetik qiymatini qaytaruvchi usulni yozing .
  • voidBir qator qatorlarni oladigan va eng uzun so'zni chop etadigan usulni yozing .
  • booleanBirinchi argument sifatida turdagi o'zgaruvchini Stringva booleankeyingi argument sifatida bir qator uzunlikdagi o'zgaruvchini qaytaradigan va oladigan usulni yozing .
    Mumkin Stringqiymatlar AND, OR, XOR. Agar birinchi argument boshqa qiymatga ega bo'lsa, usul istisno qo'yishi kerak IllegalArgumentException.
    Usul varargs argumentining har bir elementida mantiqiy operatsiyani (birinchi argumentda ko'rsatilgan) bajarishi va hisoblash natijasini qaytarishi kerak.
Misol argumentlari va natijasi:
  • "VA", rost, to'g'ri, noto'g'ri - false qaytaradi
  • "YOKI", noto'g'ri, to'g'ri, noto'g'ri, noto'g'ri - haqiqatni qaytaradi
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION