JavaRush /Блоги Java /Random-TG /Java вуҷуд дорад

Java вуҷуд дорад

Дар гурӯҳ нашр шудааст
Имрӯз мо чунин чизеро ба монанди varargs дар Java муҳокима хоҳем кард. Varargs - ё Аргументҳои тағирёбанда - технологияест, ки ба шумо имкон медиҳад усулҳоро бо шумораи ихтиёрии аргументҳо эҷод кунед. Дар ин мақола мо мефаҳмем, ки чӣ тавр сохтани чунин усулҳо, муҳокима кардани чаро вараргҳо ва кай беҳтар истифода бурдани онҳост.

Вараргҳо чист?

Вараргҳо далелҳои дарозии тағирёбанда мебошанд: хусусияте, ки дар JDK5 пайдо шудааст. Varargs ба мо имкон медиҳад, ки усулҳоро бо шумораи худсаронаи аргументҳо эҷод кунем. Умуман, пештар чунин усулҳоро эҷод кардан мумкин буд. Дуруст, ин кор чандон қулай набуд. Як мисол меорем. Фарз мекунем, ки ба мо лозим аст, ки усуле нависем, ки шумораи худсаронаи аргументҳои бутунро гирифта, онҳоро якҷоя кунад. Java 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);
Он гоҳ мо то ҳол аз миқдори аз ҳад зиёди code халос намешавем. Аммо, бо нашри 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 қоидаҳои варарг

Қоидаи 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]);
        }
    }
}

Намунаҳои varargs

Дар мисоли дар поён овардашуда мо усулеро менависем, ки vararg-ҳои аз ададҳои бутунро гирифта, шумораи элементҳои гузаронидашуда ва маблағи онҳоро нишон медиҳад. Биёед ба ин усул ҳам массив ва ҳам як қатор ададҳои бутунро гузаронем (ҳарду интихоб дуруст аст):
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инчунин вараргҳоро қабул мекунад. Агар мо ба рамзи ин усул назар андозем, мо инро мебинем:
public PrintStream printf(String format, Object ... args) {
    return format(format, args);
}
Дигар усули васеъ истифодашаванда, ки варагҳоро қабул мекунад String.format. Рамзи он дар зер нишон дода шудааст:
public static String format(String format, Object... args) {
    return new Formatter().format(format, args).toString();
}

Вараргро кай истифода бурдан мумкин аст?

Ҷавоб ба ин савол аз он вобаста аст, ки кӣ мепурсад. Агар саволи шабеҳ аз ҷониби муштарии баъзе API, ки дорои усулҳои varargҳо мебошад, дода шавад, пас ҷавобаш "ин гуна усулҳоро ҳарчи зудтар истифода баред" хоҳад буд. Барои муштарии code, varargs тавассути осон кардани навиштани code ва хондан осонтар ҳаётро осон мекунад. Аммо, агар ин савол аз ҷониби як таҳиягари API дода шавад, ки дар ҳайрат аст, ки шумо бояд чанд вақт бояд усулҳоро бо varargs эҷод кунед, пас ҷавоб "шумо набояд зуд-зуд varargҳоро истифода баред." Varargs бояд танҳо вақте истифода шавад, ки фоидаи истифодаи он аён аст. Шумо инчунин бояд аз усулҳои изофабор бо varargҳо худдорӣ кунед, зеро ин барои муштариёни codeи шумо фаҳмидани кадоме аз усулҳои изофабор воқеан номида мешавад, душвор хоҳад кард.

Хулоса

Ҳамин тавр, мо як мавзӯи дигарро баррасӣ кардем, varargs дар Java. Мо фаҳмидем, ки он чӣ аст. Мо қоидаҳои истифодаи varargҳоро тавсиф кардем. Мо мисолҳои усулҳоро бо далелҳои худсарона дида баромадем ва инчунин муҳокима кардем, ки кай истифодаи varargҳо беҳтар аст ва кай аз истифодаи онҳо худдорӣ кардан беҳтар аст. Ҳамчун вазифаи хонагӣ, шумо метавонед усулҳои зеринро иҷро кунед:
  • voidУсулеро нависед , ки як қатор ададҳоро мегирад ва миёнаи арифметикии онҳоро бармегардонад.
  • voidУсулеро нависед , ки як қатор сатрҳоро мегирад ва калимаи дарозтаринро чоп мекунад.
  • Усулеро нависед, ки booleanтағирёбандаи навъи ҳамчун далели аввал Stringва як қатор booleanдарозии тағирёбандаро ҳамчун аргументи навбатӣ бармегардонад ва мегирад.
    Арзишҳои имконпазир Stringинҳоянд AND, OR, XOR. Агар аргументи аввал арзиши дигаре дошта бошад, усул бояд истисноро партофт IllegalArgumentException.
    Метод бояд амалиёти мантиқиро (дар аргументи аввал нишон дода шудааст) дар ҳар як унсури аргументи varargs иҷро кунад ва натиҷаи ҳисобро баргардонад.
Намунаи далелҳо ва натиҷа:
  • "ВА", ҳақиқӣ, ҳақиқӣ, бардурӯғ - бардурӯғ бармегардад
  • "Ё", бардурӯғ, рост, бардурӯғ, бардурӯғ - ҳақиқӣ бармегардад
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION