A cosa servono i puntini di sospensione (...) in questa firma del metodo?


203

Nei documenti di App Engine , a cosa servono i puntini di sospensione ( JID...) in questa firma del metodo?

public MessageBuilder withRecipientJids(JID... recipientJids)

Qual è la funzione di quei tre punti?


7
A proposito, ho provato il personaggio ELLIPSIS ORIZZONTALE , Unicode U + 2026. NetBeans 8 in Java 8 riporta "carattere illegale". Così Java varargs richiedere la tripla e basta (periodo), ....
Basil Bourque,

Risposte:


208

Quelli sono i vararg Java. Ti consentono di passare qualsiasi numero di oggetti di un tipo specifico (in questo caso sono di tipo JID).

Nel tuo esempio, le seguenti chiamate di funzione sarebbero valide:

MessageBuilder msgBuilder; //There should probably be a call to a constructor here ;)
MessageBuilder msgBuilder2;
msgBuilder.withRecipientJids(jid1, jid2);
msgBuilder2.withRecipientJids(jid1, jid2, jid78_a, someOtherJid);

Scopri di più qui: http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html


16
Si noti che gli argomenti possono anche essere passati come array di JID (questo rende varargs retrocompatibile).
mjn,

54
Si noti inoltre che passare 0 varargs (niente) è legale.
Hawkeye Parker,

9
Ultimo ma non meno importante, vararg deve essere l'ultimo parametro del metodo. Pertanto, non è possibile avere due parametri vararg nello stesso metodo. Forse, puoi trovare questo metodo interessante docs.oracle.com/javase/7/docs/api/java/util/…
BlackBrain

62

Il modo di usare i puntini di sospensione o i vararg all'interno del metodo è come se fosse un array:

public void PrintWithEllipsis(String...setOfStrings) {
    for (String s : setOfStrings)
        System.out.println(s);
}

Questo metodo può essere chiamato come segue:

obj.PrintWithEllipsis(); // prints nothing
obj.PrintWithEllipsis("first"); // prints "first"
obj.PrintWithEllipsis("first", "second"); // prints "first\nsecond"

All'interno PrintWithEllipsis, il tipo di setOfStringsè una matrice di String. Quindi potresti salvare un po 'di lavoro nel compilatore e passare un array:

String[] argsVar = {"first", "second"};
obj.PrintWithEllipsis(argsVar);

Per i metodi varargs , un parametro di sequenza viene considerato come un array dello stesso tipo. Quindi, se due firme differiscono solo per il fatto che una dichiara una sequenza e l'altra una matrice, come in questo esempio:

void process(String[] s){}
void process(String...s){}

quindi si verifica un errore di compilazione.

Fonte: la specifica del linguaggio di programmazione Java , in cui il termine tecnico è variable arity parameterpiuttosto che il termine comune varargs.


22

La notazione a tre punti (...) è in realtà presa in prestito dalla matematica e significa "... e così via".

Per quanto riguarda il suo uso in Java, rappresenta varargs, il che significa che è possibile aggiungere qualsiasi numero di argomenti alla chiamata del metodo. Le uniche limitazioni sono che varargsdeve essere alla fine della firma del metodo e può essercene solo una per metodo.


5

Questi sono varargsutilizzati per creare un metodo che riceve un numero qualsiasi di argomenti.

Ad esempio il metodo PrintStream.printf lo utilizza, poiché non sai quanti argomenti utilizzeresti.

Possono essere usati solo come posizione finale degli argomenti.

varargsè stato aggiunto su Java 1.5


3

Significa che il metodo accetta un numero variabile di argomenti ("varargs") di tipo JID. All'interno del metodo, recipientJidsè presentato.

Questo è utile per i casi in cui hai un metodo che può opzionalmente gestire più di un argomento in modo naturale e ti consente di scrivere chiamate che possono passare uno, due o tre parametri allo stesso metodo, senza avere la bruttezza di creare un array al volo.

Permette anche modi di dire come sprintfda C; vedi String.format(), per esempio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.