JavaRush /Java Blog /Random-TK /Java varargs

Java varargs

Toparda çap edildi
Bu gün Java-da varargs ýaly bir zady ara alyp maslahatlaşarys. Varargs - ýa-da üýtgeýän argumentler - özbaşdak sanly argument bilen usullary döretmäge mümkinçilik berýän tehnologiýa. Bu makalada şeýle usullary nädip döretmelidigini öwreneris, vararglaryň näme üçin zerurdygyny we haçan ulanmalydygyny ara alyp maslahatlaşarys.

Varargs näme?

Varargs üýtgeýän uzynlykly argumentler: JDK5-de peýda bolan aýratynlyk. Varargs, özbaşdak köp sanly argument bilen usullary döretmäge mümkinçilik berýär. Umuman aýdylanda, öň şeýle usullary döredip bolýardy. Dogry, muny etmek gaty amatly däldi. Mysal getireliň. Bitewi san sanlaryny alyp, olary bilelikde goşjak usul ýazmaly diýeliň. Java varargs - 1Bizde iki wariant bar. 1-nji wariant - artykmaç ýüklemek:
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){...};
}
Overöne artykmaç ýüklemekde iki mesele bar. Birinjiden, durmagyň wagty haçan düşnükli däl, ikinjiden, kyn. Toplumlar has gowy. 2-nji wariant - massiwler:
class Calculator {
    int sum(int[] numbers){...};
}
Bir massiw bilen indi kyn däl we massiw hiç zada meňzemeýär ... usuly çagyrmagyň wagty gelýänçä:
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);
}
Elbetde, hemme zady has gysga ýazyp bilersiňiz. Firstöne birinjiden, massiwleri üýtgeýän uzyn argumentler hökmünde ulanmagyň oňaýsyzlygyny görkezmek isleýärin, ikinjiden, hatda şeýle ýazsak-da:
int[] arguments = {1,10,123,234,6234,12,8};
int sum = calculator.sum(arguments);
Soň bolsa koduň aşa köp mukdaryndan dynyp bilmeris. Şeýle-de bolsa, “Java 5” -iň çykmagy bilen “Varargs” aýratynlygy bu meseleleri çözmek üçin peýda boldy. Usullara özbaşdak köp sanly argument geçirmäge mümkinçilik berdi. Bu bir zat ýaly:
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();
    }
}
Geliň, jemläliň. “Varargs” üýtgeýän uzyn argumentler, “Java 5” -iň çykmagy bilen ýüze çykan aýratynlyk. Soňra, Varargs bilen işlemegiň käbir düzgünlerine has içgin serederis.

5 sany düzgün

Düzgün 1. Vararg argumenti (ýa-da üýtgeýän / özbaşdak uzynlyk argumenti) ellips bilen aşakdaky ýaly görkezilýär:
String... words
Integer... numbers
Person... people
Cat... cats
Düzgün 2. Esassyz uzynlygyň argumentini diňe käbir usula argument hökmünde kesgitläp bolar:
void print(String... words)
int sum(Integer... numbers)
void save(Person... people)
void feed(Cat... cats)
Düzgün 3. Usul organyndaky şeýle üýtgeýän uzynlykdaky argumentleriň her biri bir massiwdir:
void print(String... words){
    for (int i = 0; i < words.length; i++) {
        System.out.println(words[i]);
    }
}
Düzgün 4. Vararg argumenti usul argumentleriniň sanawynda iň soňky bolmaly:
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-nji düzgün: Varargs massiw bolsa-da, üýtgeýän uzyn argumentleri alýan usuly çagyranyňyzda, massiw döretmek hökman däl. Diňe dykgat bilen bölünen zerur argumentleri sanamak ýeterlik we hatda islenýä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]);
        }
    }
}

Warargs mysallary

Aşakdaky mysalda, bitewi sanlardan ybarat we geçýän elementleriň sanyny we olaryň jemini görkezýän usuly ýazarys. Geliň, bu usula bir massiw we bitewi sanlar geçireliň (iki warianty hem dogry):
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);
}
Programma işledilenden soň çykar:

Кол-во элементов для сложения - 100, сумма - 4950 
Кол-во элементов для сложения - 10, сумма - 55 
Usulyň vararglary hem kabul edýändigini bellemelidiris System.out.printf. Bu usulyň koduna seretsek, muny göreris:
public PrintStream printf(String format, Object ... args) {
    return format(format, args);
}
Waraglary kabul edýän giňden ulanylýan usul String.format. Kody aşakda görkezilýär:
public static String format(String format, Object... args) {
    return new Formatter().format(format, args).toString();
}

Varargs haçan ulanmaly?

Bu soraga jogap kimiň soraýandygyna baglydyr. Eger şuňa meňzeş sorag käbir API-leriň müşderisi tarapyndan varargs usuly bolan soralsa, jogap "mümkin boldugyça köplenç ulanyň". Kod müşderisi üçin, varargs kod ýazmagy aňsat we has okalýan görnüşde durmuşy has aňsatlaşdyrýar. Şeýle-de bolsa, bu soragy näçe gezek varargs bilen usul döretmelidigi bilen gyzyklanýan API döredijisi soralsa, jogap “vararglary ýygy-ýygydan ulanmaly dälsiňiz”. Varargs diňe ulanylyşynyň peýdasy aýdyň bolanda ulanylmaly. Şeýle hem, “varargs” bilen aşa köp ýüklemek usullaryndan gaça durmalysyňyz, sebäbi bu koduňyzyň müşderilerine artykmaç usullaryň haýsysynyň hakykatdanam atlandyrylmagyna düşünmegi kynlaşdyrar.

Netije

Şeýlelik bilen, Java-da başga bir mowzuk açdyk. Munuň nämedigine düşündik. Varargs ulanmagyň düzgünlerini düşündirdik. Esassyz uzynlykly argumentler bilen usullaryň mysallaryna göz aýladyk, haçan-da vararglary ulanmagyň has gowudygyny we haçan ulanmakdan saklanmagyň has gowudygyny ara alyp maslahatlaşdyk. Öý işi hökmünde aşakdaky usullary durmuşa geçirip bilersiňiz:
  • voidBitewi sanlary alýan we arifmetiki manysyny yzyna alýan usuly ýazyň .
  • voidBirnäçe setir alýan we iň uzyn sözi çap edýän usul ýazyň .
  • booleanBirinji argument hökmünde görnüşiň üýtgeýjisini we indiki argument hökmünde üýtgeýän uzynlygyň Stringyzygiderliligini alýan usuly ýazyň . Mümkin bolan gymmatlyklar ,, . Birinji argumentiň başga bir gymmaty bar bolsa, usul kadadan çykma bolmaly . Usul, varargs argumentiniň her elementinde logiki amal etmeli (birinji argumentde görkezilýär) we hasaplamanyň netijesini yzyna gaýtarmaly.boolean
    StringANDORXORIllegalArgumentException
Mysal üçin argumentler we netijeler:
  • "WE", dogry, dogry, ýalan - ýalan gaýdyp geler
  • "ORA-da", ýalan, dogry, ýalan, ýalan - hakykata gaýdyp geler
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION