Selles artiklis saate näiteid kasutades teada Java-i varargidest. Samuti saate teada, millal vararge kasutada ja millal mitte.
Mis on Java-s varargs?
Oletame, et loote Java-meetodit. Kuid te pole kindel, mitu argumenti teie meetod aktsepteerib. Selle probleemi lahendamiseks tõi Java 1.5 kasutusele varargid.
Varargs on muutujate argumentide lühike nimi. Javas saab meetodi argument aktsepteerida suvalise arvu väärtusi. Seda argumenti, mis võib aktsepteerida muutuvat arvu väärtusi, nimetatakse varargiteks.
Varargsi rakendamise süntaks on järgmine:
accessModifier methodName (andmetüüp… arg) (// meetodi keha)
Varargi määratlemiseks …
kasutatakse meetodi formaalses parameetris (kolme punkti).
Meetodit, mis võtab muutuva arvu argumente, nimetatakse muutuja ariteetiga meetodiks või lihtsalt varargsi meetodiks.
Kõigepealt vaatame näidet ilma varargsi kasutamata:
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)); ) )
Selle programmi käivitamisel on väljund järgmine:
3 6
Nagu selgelt näete, pidite sumNumber()
meetodit üle koormama, et see töötaks 3 argumendi jaoks.
Mis siis, kui kasutaja soovib lisada 5 numbrit või 10 või 100?
Sellega saab varargide abil kenasti hakkama. Vaatame koodi näidet:
Näide: Varargide töötamine
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); ) )
Programmi käivitamisel on väljund järgmine:
argumendi pikkus: 2 sum2 = 6 argumendi pikkus: 3 summa3 = 9 argumendi pikkus: 4 summa4 = 16
Siin sumNumber()
tagastab meetod talle edastatud int
parameetrite summa (vahet pole, kui palju argumente on edastatud).
Nagu näete, võivad varargid olla mõnes olukorras tõesti kasulikud. Kuid kui olete meetodile edastatud argumentide arv kindel, kasutas selle asemel meetodi ülekoormamist. Näiteks kui olete kindel, et seda sumNumber()
meetodit kasutatakse ainult 2 või 3 argumendi summa arvutamiseks, kasutage ülekoormamist nagu esimeses näites.
Võtame veel ühe näite. Java-teegis määratletud vormingu () meetod aktsepteerib varargse. JDK-s on format()
meetod määratletud järgmiselt:
avalik staatiline stringi formaat (lokaat l, stringi vorming, objekt … args) (// keha)
Näide: format () meetod
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 ) ); ) )
Programmi käivitamisel on väljund järgmine:
Saidi nimi: programiz.com, Emp Count: 6 Tüüp: õpetuse veebisait
Kuidas varargid kulisside taga toimivad?
Vaatleme järgmist pseudokoodi:
public int sumNumber (int… nums) (// meetodi keha)
…
Süntaks räägib Java kompilaator, et meetod võib nimetada null või rohkem argumente. Selle tulemusel deklareeritakse muutuja nums kaudselt tüüpi massiivina int( )
. Seega pääseb meetodi sees muutujale Nums massiivi süntaksiga.
Kui argumente pole, on nummide pikkus 0.
Varargsi meetodite ülekoormamine
Sarnaselt tavalistele meetoditele saate varargi meetodeid üle koormata.
Soovitatav lugemine: Java-meetodi ülekoormamine
Näide: Varargsi meetodi ülekoormamine
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"); ) )
Programmi käivitamisel on väljund järgmine:
summa = 6 eitama = vale arg. pikkus = 2
Ülaltoodud programmis on test()
meetod üle koormatud, muutes aktsepteeritavate argumentide arvu.
Varargsi kasutamise ajal meeldejäävad asjad
Siin on paar asja, mida peaksite Java vargaritega töötades meeles pidama:
1. Meetodi allkirja määratlemisel hoidke alati alati varargid.
Muutujaargument peab olema viimane meetodile edastatud argument. Mõelgem, kas kasutasite doSomething()
sellist meetodit:
doShathing (1, 2, 3, 4);
Ja teie doSomething()
meetod on määratletud järgmiselt:
// vale meetodi deklaratsioon public void doSomething (int… nums, int p) (// meetodi keha)
Sel juhul ei suuda kompilaator välja selgitada, mitu argumenti arvudele edastatakse.
Kui määrate oma meetodi järgmiselt:
public void doSomething (int p, int… nums) (// meetodi keha)
Java kompilaator määrab esimese argumendi p-le ja ülejäänud int
argumendid määratakse numbritele.
2. Meetodil võib olla ainult üks varargsi parameeter.
Näiteks on selle meetodi deklaratsioon vale:
int doSomething (int p, float… floatNums, double… doubleNums) (// kood)
Mitmetähenduslikkus Varargsi meetodi ülekoormamisel
Mõelgem teile ülekoormatud test()
meetodile järgmiselt:
klassi demo (staatilise tühimiku test (int… vargs) (// meetodi keha) staatiline tühimiku test (int n, int… vargs) (// meetodi keha))
Ülaltoodud programmis satub kompilaator segadusse, kui proovite test()
meetodit käivitada, kuigi test()
meetodid on ülekoormatud ja aktsepteerivad erinevat arvu argumente.
Koostaja ei tea, millist meetodit helistada. Koostaja võib arvata, et proovite helistada test(int… vargs)
ühe varargsi argumendiga. Samuti võib kompilaator arvata, et proovite helistada test(int n, int… vargs)
argumendiga, mis edastatakse esimesele parameetrile tühja teise parameetriga.
Kuna on kaks võimalust, tekitab see ebaselgust. Seetõttu peate võib-olla varargsi meetodi ülekoormamise asemel mõnikord kasutama kahte erinevat meetodinime.