Untuk apa ellipsis (...) dalam tanda tangan metode ini?

203

Dalam dokumen App Engine , untuk apa ellipsis ( JID...) dalam tanda tangan metode ini?

public MessageBuilder withRecipientJids(JID... recipientJids)

Apa fungsi dari ketiga titik itu?

natchy
sumber
7
Omong-omong, saya mencoba karakter HORIZONTAL ELLIPSIS ,, Unicode U + 2026. NetBeans 8 di Java 8 melaporkan "karakter ilegal". Jadi Java varargs memerlukan triple FULL STOP (periode) ...,.
Basil Bourque

Jawaban:

208

Itu adalah Java varargs. Mereka membiarkan Anda melewati sejumlah objek dari tipe tertentu (dalam hal ini mereka adalah tipe JID).

Dalam contoh Anda, panggilan fungsi berikut akan valid:

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

Lihat lebih lanjut di sini: http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html

FrustratedWithFormsDesigner
sumber
16
Perhatikan bahwa argumen juga dapat diteruskan sebagai array JID (ini membuat varargs kompatibel ke belakang).
mjn
54
Juga perhatikan bahwa melewati 0 vararg (tidak ada) adalah sah.
Hawkeye Parker
9
Last but not least, vararg harus menjadi parameter terakhir dari metode ini. Jadi, Anda tidak dapat memiliki dua parameter vararg dalam metode yang sama. Mungkin, Anda dapat menemukan metode ini menarik docs.oracle.com/javase/7/docs/api/java/util/…
BlackBrain
62

Cara menggunakan ellipsis atau varargs di dalam metode adalah seolah-olah array:

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

Metode ini dapat disebut sebagai berikut:

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

Di dalam PrintWithEllipsis, jenis setOfStringsadalah array dari String. Jadi Anda bisa menyimpan beberapa pekerjaan kompiler dan melewatkan array:

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

Untuk metode varargs , parameter urutan diperlakukan sebagai array dengan tipe yang sama. Jadi, jika dua tanda tangan berbeda hanya dalam satu yang menyatakan urutan dan yang lainnya merupakan array, seperti dalam contoh ini:

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

kemudian kesalahan waktu kompilasi terjadi.

Sumber: Spesifikasi Bahasa Pemrograman Java , di mana istilah teknisnya variable arity parameterbukan istilah umum varargs.

Lucio
sumber
22

Notasi tiga titik (...) sebenarnya dipinjam dari matematika, dan itu berarti "... dan seterusnya".

Adapun penggunaannya di Jawa, itu singkatan varargs, yang berarti bahwa sejumlah argumen dapat ditambahkan ke pemanggilan metode. Satu-satunya batasan adalah bahwa varargsharus di akhir tanda tangan metode dan hanya ada satu per metode.

James Goodwin
sumber
5

Itu adalah varargsmereka digunakan untuk membuat metode yang menerima sejumlah argumen.

Misalnya metode PrintStream.printf menggunakannya, karena Anda tidak tahu berapa banyak argumen yang akan Anda gunakan.

Mereka hanya dapat digunakan sebagai posisi akhir dari argumen.

varargstelah ditambahkan di Java 1.5

OscarRyz
sumber
3

Ini berarti bahwa metode menerima sejumlah variabel argumen ("varargs") dari tipe JID. Dalam metode, recipientJidsdisajikan.

Ini berguna untuk kasus di mana Anda memiliki metode yang secara opsional dapat menangani lebih dari satu argumen dengan cara alami, dan memungkinkan Anda untuk menulis panggilan yang dapat melewati satu, dua atau tiga parameter ke metode yang sama, tanpa memiliki keburukan dalam menciptakan sebuah array dengan cepat.

Ini juga memungkinkan idiom seperti sprintfdari C; lihat String.format(), misalnya.

rampok
sumber