Java Varargs (argomenti variabili) con esempi

In questo articolo, imparerai a conoscere i vararg in Java con l'aiuto di esempi. Imparerai anche quando usare i vararg e quando non usarli.

Cos'è varargs in Java?

Supponiamo che tu stia creando un metodo Java. Tuttavia, non sei sicuro di quanti argomenti accetterà il tuo metodo. Per risolvere questo problema, Java 1.5 ha introdotto varargs.

Varargs è un nome breve per argomenti variabili. In Java, un argomento di un metodo può accettare un numero arbitrario di valori. Questo argomento che può accettare un numero variabile di valori è chiamato varargs.

La sintassi per l'implementazione di vararg è la seguente:

 accessModifier methodName (datatype… arg) (// corpo del metodo)

Per definire vararg, (tre punti) viene utilizzato nel parametro formale di un metodo.

Un metodo che accetta un numero variabile di argomenti è chiamato metodo arity variabile o semplicemente metodo varargs.

Per prima cosa, diamo un'occhiata all'esempio senza usare varargs:

 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)); ) )

Quando esegui questo programma, l'output sarà:

 3 6

Come puoi vedere chiaramente, hai dovuto sovraccaricare il sumNumber()metodo per farlo funzionare per 3 argomenti.

E se l'utente desidera aggiungere 5 numeri o 10 o 100?

Questo può essere gestito in modo ordinato con l'uso di vararg. Vediamo un esempio di codice:

Esempio: funzionamento di varargs

 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); ) )

Quando esegui il programma, l'output sarà:

 lunghezza argomento: 2 somma2 = 6 lunghezza argomento: 3 somma3 = 9 lunghezza argomento: 4 somma4 = 16

Qui, il sumNumber()metodo restituisce la somma dei intparametri passati (non importa il numero di argomenti passati).

Come puoi vedere, i vararg possono essere davvero utili in alcune situazioni. Tuttavia, se si è certi del numero di argomenti passati a un metodo, utilizzare invece il sovraccarico del metodo. Ad esempio, se si è certi che il sumNumber()metodo verrà utilizzato solo per calcolare la somma di 2 o 3 argomenti, utilizzare l'overload come nel primo esempio.

Facciamo un altro esempio. Il metodo format () definito nella libreria Java accetta varargs. In JDK, il format()metodo è definito come segue:

 formato stringa statico pubblico (Locale l, formato String, Object… args) (// body)

Esempio: metodo format ()

 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 ) ); ) )

Quando esegui il programma, l'output sarà:

 Nome sito: programiz.com, Emp Count: 6 Tipo: tutorial website 

Come funziona varargs dietro le quinte?

Consideriamo il seguente pseudo codice:

 public int sumNumber (int… nums) (// corpo del metodo)

La sintassi dice al compilatore Java che il metodo può essere chiamato con zero o più argomenti. Di conseguenza, la variabile nums viene dichiarata implicitamente come matrice di tipo int( ). Pertanto, all'interno del metodo, si accede alla variabile nums utilizzando la sintassi dell'array.

In caso di nessun argomento, la lunghezza di num è 0.

Sovraccarico dei metodi Varargs

Simile ai metodi tipici, puoi sovraccaricare i metodi vararg.

Letture consigliate: sovraccarico del metodo Java

Esempio: sovraccarico del metodo Varargs

 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"); ) ) 

Quando esegui il programma, l'output sarà:

 sum = 6 negate = false args.length = 2

Nel programma precedente, il test()metodo viene sovraccaricato modificando il numero di argomenti che accetta.

Cose da ricordare durante l'utilizzo di Varargs

Ecco un paio di cose che dovresti ricordare mentre lavori con Java vargar:

1. Durante la definizione della firma del metodo, mantenere sempre i varargs alla fine.

L'argomento della variabile deve essere l'ultimo argomento passato al metodo. Consideriamo, hai invocato un doSomething()metodo come questo:

 doSomething (1, 2, 3, 4);

E il tuo doSomething()metodo è definito come:

 // dichiarazione di metodo errato public void doSomething (int… nums, int p) (// method body)

In questo caso, il compilatore non può calcolare il numero di argomenti passati a nums.

Tuttavia, se definisci il tuo metodo come:

 public void doSomething (int p, int… nums) (// corpo del metodo)

Il compilatore Java assegna il primo argomento a p e gli intargomenti rimanenti vengono assegnati a nums.

2. Un metodo può avere un solo parametro varargs.

Ad esempio, questa dichiarazione del metodo non è corretta:

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

Ambiguità nel sovraccarico del metodo Varargs

Consideriamo un test()metodo sovraccarico come questo:

 class Demo (static void test (int… vargs) (// method body) static void test (int n, int… vargs) (// method body))

Nel programma precedente, il compilatore si confonde se si tenta di invocare il test()metodo anche se i test()metodi sono sovraccarichi e accetta un numero diverso di argomenti.

Il compilatore non sa quale metodo chiamare. Il compilatore potrebbe pensare che stai cercando di chiamare test(int… vargs)con un argomento varargs. Inoltre, il compilatore potrebbe pensare che stai cercando di chiamare test(int n, int… vargs)con l'argomento passato al primo parametro con il secondo parametro vuoto.

Poiché ci sono due possibilità, causa ambiguità. Per questo motivo, a volte potrebbe essere necessario utilizzare due diversi nomi di metodo invece di sovraccaricare il metodo varargs.

Articoli interessanti...