Java varargs

Группада жарыяланган
Бүгүн биз Javaдагы varargs сыяктуу нерсени талкуулайбыз. Varargs - же Variable Arguments - бул аргументтердин ыктыярдуу саны менен методдорду түзүүгө мүмкүндүк берген технология. Бул макалада биз мындай ыкмаларды кантип түзүүнү үйрөнөбүз, эмне үчүн вараргтар керек жана аларды качан колдонуу жакшы болорун талкуулайбыз.

Varargs деген эмне?

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-эреже. Ваарг аргументи метод аргументтеринин тизмесинде акыркысы болушу керек:
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-эреже: Varargs массивдер болсо да, өзгөрүлмө узундуктагы аргументтерди алган методду чакырганда массивди түзүү зарыл эмес. Зарыл болгон аргументтерди үтүр менен ажыратып коюу жетиштүү жана ал тургай эң керектүү:
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 мисалдары

Төмөндөгү мисалда бүтүн сандардан турган вараргтарды алып, өткөн элементтердин санын жана алардын суммасын көрсөткөн ыкманы жазабыз. Бул методго массивди да, бүтүн сандардын сериясын да өткөрөлү (эки вариант тең жарактуу):
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 
Бул ыкма ошондой эле varargs кабыл экенин белгилей кетүү керек System.out.printf. Бул ыкманын codeун карасак, муну көрөбүз:
public PrintStream printf(String format, Object ... args) {
    return format(format, args);
}
Варагтарды кабыл алган дагы бир кеңири колдонулган ыкма String.format. Анын codeу төмөндө көрсөтүлгөн:
public static String format(String format, Object... args) {
    return new Formatter().format(format, args).toString();
}

varargs качан колдонуу керек?

Бул суроонун жообу ким сурап жатканына жараша болот. Эгерде ушундай эле суроону varargs менен методдору бар кээ бир API кардары берсе, анда жооп "мындай ыкмаларды мүмкүн болушунча тез-тез колдонуу" болот. Код кардары үчүн varargs codeду жазууну жана окууну жеңилдетип, жашоону бир топ жеңилдетет. Бирок, бул суроону varargs менен методдорду канчалык көп түзүү керектиги жөнүндө ойлонгон API иштеп чыгуучусу берсе, анда жооп "сиз varargs көп колдонбошуңуз керек" болот. Varargs аны колдонуунун пайдасы айкын болгондо гана колдонулушу керек. Сиз ошондой эле varargs менен ашыкча жүктөө ыкмаларынан качышыңыз керек, анткени бул сиздин codeуңуздун кардарларына ашыкча жүктөлгөн ыкмалардын кайсынысы чындыгында аталганын түшүнүүнү кыйындатат.

Корутунду

Ошентип, биз Javaдагы varargs деген дагы бир теманы карадык. Биз анын эмне экенин түшүндүк. Биз vararg колдонуу эрежелерин сүрөттөп бердик. Биз ыктыярдуу узундуктагы аргументтери бар ыкмалардын мисалдарын карап чыктык, ошондой эле вараргтарды качан колдонуу жакшы жана качан аларды колдонуудан баш тартуу жакшы экенин талкууладык. Үй тапшырмасы катары төмөнкү ыкмаларды ишке ашыра аласыз:
  • voidБир катар бүтүн сандарды алып, алардын арифметикалык орточо маанисин бере турган ыкманы жазыңыз .
  • voidБир катар саптарды алып, эң узун сөздү басып чыгарган ыкманы жазыңыз .
  • booleanБиринчи аргумент катары түрдөгү өзгөрмөлөрдү Stringжана booleanкийинки аргумент катары бир катар узундуктагы өзгөрмөлөрдү ала турган ыкманы жазыңыз . Мүмкүн
    болгон баалуулуктар , , . Эгерде биринчи аргумент башка мааниге ээ болсо, метод өзгөчө кырдаалды ташташы керек . Метод varargs аргументинин ар бир элементи боюнча логикалык операцияны (биринчи аргументте көрсөтүлгөн) аткарып, эсептөөнүн жыйынтыгын бериши керек.StringANDORXORIllegalArgumentException
Мисал аргументтер жана натыйжа:
  • "ЖАНА", чын, чын, жалган - жалганды кайтарат
  • "ЖЕ", false, true, false, false - чындыкты кайтарат
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION