Java Varargs (Variable Arguments) Esimerkkejä

Tässä artikkelissa opit Java-varargeista esimerkkien avulla. Opit myös, milloin varargeja tulee käyttää ja milloin ei.

Mikä on Java-varargs?

Oletetaan, että luot Java-menetelmän. Et kuitenkaan ole varma, kuinka monta argumenttia menetelmäsi hyväksyy. Tämän ongelman ratkaisemiseksi Java 1.5 otti käyttöön varargit.

Varargs on lyhenne muuttujan argumenteista. Java-tilassa menetelmän argumentti voi hyväksyä mielivaltaisen määrän arvoja. Tätä argumenttia, joka voi hyväksyä muuttuvan määrän arvoja, kutsutaan varargeiksi.

Syntaksi varargien toteuttamisessa on seuraava:

 accessModifier methodName (tietotyyppi… arg) (// method body)

Varargin määrittelemiseksi ((kolme pistettä) käytetään menetelmän muodollisessa parametrissa.

Menetelmää, joka ottaa muuttuvan määrän argumentteja, kutsutaan muuttujanaritymenetelmäksi tai yksinkertaisesti varargs-menetelmäksi.

Tarkastellaan ensin esimerkkiä käyttämättä varargeja:

 class NoVararg ( public int sumNumber(int a, int b)( return a+b; ) public int sumNumber(int a, int b, int c)( return a+b+c; ) public static void main( String() args ) ( NoVararg obj = new NoVararg(); System.out.println(obj.sumNumber(1, 2)); System.out.println(obj.sumNumber(1, 2, 3)); ) )

Kun suoritat tämän ohjelman, tulos on:

 3 6

Kuten voit selvästi nähdä, joudut ylikuormittamaan sumNumber()menetelmää, jotta se toimisi 3 argumentissa.

Entä jos käyttäjä haluaa lisätä 5 numeroa tai 10 tai 100?

Tämä voidaan hoitaa siististi varargien avulla. Katsotaanpa koodiesimerkki:

Esimerkki: Varargien työskentely

 class VarargExample ( public int sumNumber(int… args)( System.out.println("argument length: " + args.length); int sum = 0; for(int x: args)( sum += x; ) return sum; ) public static void main( String() args ) ( VarargExample ex = new VarargExample(); int sum2 = ex.sumNumber(2, 4); System.out.println("sum2 = " + sum2); int sum3 = ex.sumNumber(1, 3, 5); System.out.println("sum3 = " + sum3); int sum4 = ex.sumNumber(1, 3, 5, 7); System.out.println("sum4 = " + sum4); ) )

Kun suoritat ohjelmaa, tulos on:

 argumentin pituus: 2 summa2 = 6 argumentin pituus: 3 summa3 = 9 argumentin pituus: 4 summa4 = 16

Tällöin sumNumber()menetelmä palauttaa sille intvälitettyjen parametrien summan (ei väliä lähetettyjen argumenttien lukumäärä).

Kuten näette, varargit voivat olla todella hyödyllisiä joissakin tilanteissa. Jos kuitenkin olet varma metodille välitettävien argumenttien lukumäärästä, käytit sen sijaan menetelmän ylikuormitusta. Esimerkiksi, jos olet varma, että sumNumber()menetelmää käytetään vain laskemaan joko 2 tai 3 argumentin summa, käytä ylikuormitusta kuten ensimmäisessä esimerkissä.

Otetaan toinen esimerkki. Java-kirjastossa määritetty format () -menetelmä hyväksyy varargit. JDK: ssa format()menetelmä määritellään seuraavasti:

 julkinen staattinen merkkijonomuoto (kieli l, merkkijono, objekti … argumentit) (// body)

Esimerkki: format () -menetelmä

 class Company ( public static void main(String() args) ( String siteName = "programiz.com"; int empCount = 6; String type = "tutorial website"; System.out.println( String.format( "Site Name : %s, Emp Count: %d Type: %s", siteName, empCount, type ) ); ) )

Kun suoritat ohjelmaa, tulos on:

 Sivuston nimi: programiz.com, Emp Count: 6 Tyyppi: opetusohjelman verkkosivusto 

Kuinka varargit toimivat kulissien takana?

Tarkastellaan seuraavaa näennäiskoodia:

 public int sumNumber (int… nums) (// menetelmärunko)

Syntaksin kertoo Java-kääntäjä, että menetelmää voidaan kutsua nolla tai useampia argumentteja. Tämän seurauksena muuttuja nums ilmoitetaan implisiittisesti tyyppiryhmänä int( ). Siten menetelmän sisällä nums-muuttujaan pääsee käyttämällä taulukon syntaksia.

Jos argumentteja ei ole, nummien pituus on 0.

Varargs-menetelmien ylikuormitus

Samoin kuin tavallisissa menetelmissä, voit ylikuormittaa vararg-menetelmiä.

Suositeltava lukeminen: Java-menetelmän ylikuormitus

Esimerkki: Varargs-menetelmä Ylikuormitus

 class VarargOverload ( private void test(int… args)( int sum = 0; for (int i: args) ( sum += i; ) System.out.println("sum = " + sum); ) private void test(boolean p, String… args)( boolean negate = !p; System.out.println("negate = " + negate); System.out.println("args.length = "+ args.length); ) public static void main( String() args ) ( VarargOverload obj = new VarargOverload(); obj.test(1, 2, 3); obj.test(true, "hello", "world"); ) ) 

Kun suoritat ohjelmaa, tulos on:

 summa = 6 negatiivinen = väärät argumentit. pituus = 2

Edellä olevassa ohjelmassa test()menetelmä on ylikuormitettu muuttamalla sen hyväksymien argumenttien määrää.

Muistettavia asioita Varargsia käytettäessä

Tässä on muutama asia, jotka sinun tulisi muistaa työskennellessäsi Java-vargareiden kanssa:

1. Kun määrität menetelmän allekirjoitusta, pidä aina varargit viimeinkin.

Muuttujan argumentin on oltava viimeinen menetelmälle välitetty argumentti. Tarkastellaanpa, käytitkö doSomething()tätä menetelmää:

 doSomething (1, 2, 3, 4);

Ja teidän doSomething()menetelmä määritellään seuraavasti:

 // väärä menetelmäilmoitus public void doSomething (int… nums, int p) (// method body)

Tällöin kääntäjä ei pysty selvittämään numeroille välitettyjen argumenttien määrää.

Jos kuitenkin määrität menetelmän seuraavasti:

 public void doSomething (int p, int… nums) (// menetelmärunko)

Java-kääntäjä määrittää ensimmäisen argumentin p: lle ja loput intargumentit osoitetaan numeroille.

2. Menetelmällä voi olla vain yksi varargs-parametri.

Esimerkiksi tämä menetelmä-ilmoitus on virheellinen:

 int doSomething (int p, float… floatNums, double… doubleNums) (// koodi)

Varargs-menetelmän ylikuormituksen epäselvyys

Katsotaanpa, että olet ylikuormitettu test()menetelmä tällä tavoin:

 luokan esittely (staattinen tyhjätesti (int… vargs) (// method body) staattinen tyhjätesti (int n, int… vargs) (// method body))

Yllä olevassa ohjelmassa kääntäjä hämmentyy, jos yrität käyttää test()menetelmää, vaikka test()menetelmät ovat ylikuormitettuja ja hyväksyy useita argumentteja.

Kääntäjä ei tiedä, mihin tapaan soittaa. Kääntäjä saattaa ajatella, että yrität soittaa test(int… vargs)yhdellä varargs-argumentilla. Kääntäjä saattaa myös ajatella, että yrität soittaa test(int n, int… vargs)argumentilla, joka välitetään ensimmäiselle parametrille tyhjällä toisella parametrilla.

Koska on olemassa kaksi mahdollisuutta, se aiheuttaa epäselvyyttä. Tämän vuoksi joskus joudut ehkä käyttämään kahta erilaista metodinimeä Varargs-menetelmän ylikuormittamisen sijaan.

Mielenkiintoisia artikkeleita...