Incepand cu Java 5.0, puteti defini metode cu liste variabile de argument (var-args). Aceste metode pot fi utilizate in situatii cand nu este cunoscut numarul exact de argumente. Aceasta posibilitate este, de asemenea, disponibila si in alte limbaje de programare si chiar daca nu este folosit intensiv, este un subiect pentru examenul de SCJP.
Alte subiecte care fac parte din acest tutorial Java sunt accesibile prin intermediul Java Tutorial 6 – Cuprins.
Pentru a intelege metodele cu numar variabile de parametri, pornim de la o metoda utilizata pentru a aduna 2 numere. Metoda arata astfel:
public class Main {
public static void main(String[] args) {
int v1 = 10, v2 = 20;
System.out.println("Suma este "+doAdd(v1, v2));
}
public static int doAdd(int vb1, int vb2)
{
return vb1+vb2;
}
}
Daca modificam cerintele aplicatiei si vrem o metoda pentru adunarea a 3 numere, aceasta va fi definita astfel:
public class Main {
public static void main(String[] args) {
int v1 = 10, v2 = 20, v3 = 30;
System.out.println("Suma este "+doAdd3(v1, v2, v3));
}
public static int doAdd3(int vb1, int vb2, int vb3)
{
return vb1+vb2+vb3;
}
}
Si acest scenariu poate continua la nesfarsit. Deci, pentru eficienta, avem nevoie de o metoda care poate aduna orice numar de valori – o metoda cu o lista variabila de argumente.
Sintaxa pentru definirea unei metode de tip var-args este:
[modificatori de acces] [alti modificatori] tip_returnat numeFunctie (tip param1, tip param2, tip… listaParametri)
in care:
param1 / param2 – parametrii de intrare pentru metoda; acestia sunt optionali;
listaParametri- vector care stocheaza lista variabila de argumente; toate argumentele au acelasi tip (primitiv sau referinta); parametrul var-args este declarat intodeauna la sfârsitul listei de parametri;
Folosind o metoda de tip var-args, problema precedenta are o singura solutie:
public static int doAdd(int... values)
{
int sum = 0;
for(int i=0;i < values.length;i++)
sum+=values[i];
return sum;
}
si putem folosi metoda astfel:
public class Main {
public static void main(String[] args) {
int v1 = 10, v2 = 20, v3 = 30;
System.out.println("Suma primelor 2 variabile este "+doAdd(v1, v2));
System.out.println("Suma variabilelor este "+doAdd(v1, v2, v3));
System.out.println("Suma fara variabile este "+doAdd());
}
}
Metoda de tip var-args poate avea si alti parametri de intrare, dar acestia trebuie sa fie definiti inainte de parametrul var-arg. Urmatoarea metoda, determina suma valorilor pozitive/negative in functie de valoarea variabilei logice:
public static int doConditionalAdd(boolean flag, int... values)
{
int sum = 0;
for(int i=0;i < values.length;i++)
{
if(flag && values[i] >= 0)
sum+=values[i];
if(!flag && values[i] < 0)
sum+=values[i];
}
return sum;
}
O alternativa pentru metodele de tip var-args este de a folosi vectori ca parametri de intrare. Diferenta este ca trebuie sa definiti acest vector si trebuie sa copiati valorile variabilelor inainte de a apela metoda:
public class Main {
public static void main(String[] args) {
int v1 = 10, v2 = 20, v3 = 30;
int[] array = new int[3];
array[0] = v1;
array[1] = v2;
array[2] = v3;
//o alternativa este int[] array = {v1,v2,v3};
System.out.println("Suma valorilor este "+doAdd(array));
}
public static int doAdd(int[] values)
{
int sum = 0;
for(int i=0;i < values.length;i++)
sum+=values[i];
return sum;
}
}
Caracteristici importante ale metodele cu numar variabil de parametri (var-args) pentru SCJP:
- toate argumentele din lista de var-arg au acelasi tip (primitiv sau referinta);
- metoda poate avea alti parametri;
- o metoda poate avea o singura lista var-arg;
- lista de var-arg trebuie sa fie ultimul parametru in semnatura metodei;
Pe baza unor reguli anterioare, declaratiile urmatoare vor genera erori de compilare:
//sintaxa gresita
public static int doAdd(int valori... )
{ }
//var-arg nu este ultimul parametru
public static int doAdd(int... valori, boolean flag )
{ }
//mai multi parametri de tip var-arg
public static int doAdd(int... valori1, int... valori2 )
{ }
Alte subiecte care fac parte din acest tutorial Java sunt accesibile prin intermediul Java Tutorial 6 - Cuprins.