จุดไข่ปลา (…) สำหรับลายเซ็นวิธีนี้คืออะไร


203

ในApp Engine docsจุดไข่ปลา ( JID...) สำหรับลายเซ็นวิธีนี้คืออะไร?

public MessageBuilder withRecipientJids(JID... recipientJids)

ฟังก์ชั่นของสามจุดเหล่านั้นคืออะไร?


7
ฉันลองใช้ตัวละคร HORIZONTAL ELLIPSIS , Unicode U + 2026 NetBeans 8 ใน Java 8 รายงานว่า "อักขระผิดกฎหมาย" ดังนั้น Java varargs ต้องสามหยุดเต็ม ...(ระยะเวลา)
Basil Bourque

คำตอบ:


208

นั่นคือ Java varargs พวกเขาช่วยให้คุณผ่านจำนวนวัตถุประเภทเฉพาะใด ๆ (ในกรณีนี้พวกเขาเป็นประเภท JID)

ในตัวอย่างของคุณการเรียกใช้ฟังก์ชันต่อไปนี้จะใช้ได้:

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

ดูเพิ่มเติมได้ที่นี่: http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html


16
โปรดทราบว่าข้อโต้แย้งอาจถูกส่งผ่านเป็นอาร์เรย์ของ JID (ซึ่งทำให้ varargs เข้ากันได้แบบย้อนหลัง)
mjn

54
นอกจากนี้โปรดทราบว่าการผ่าน 0 varargs (ไม่มีอะไร) นั้นถูกกฎหมาย
Hawkeye Parker

9
สุดท้าย แต่ไม่ท้ายสุด vararg ต้องเป็นพารามิเตอร์สุดท้ายของวิธีการ ดังนั้นคุณไม่สามารถมีสองพารามิเตอร์ vararg ในวิธีเดียวกัน บางทีคุณสามารถค้นหาวิธีนี้docs.oracle.com/javase/7/docs/api/java/util// ที่
BlackBrain

62

วิธีใช้จุดไข่ปลาหรือvarargsภายในวิธีนั้นราวกับว่ามันเป็นอาร์เรย์:

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

วิธีการนี้สามารถเรียกได้ดังต่อไปนี้:

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

ภายในPrintWithEllipsisประเภทของsetOfStringsเป็นอาร์เรย์ของสตริง ดังนั้นคุณสามารถบันทึกคอมไพเลอร์บางงานและส่งผ่านอาร์เรย์:

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

สำหรับวิธีการvarargsพารามิเตอร์ลำดับจะถือว่าเป็นอาร์เรย์ประเภทเดียวกัน ดังนั้นถ้าสองลายเซ็นแตกต่างกันเฉพาะในที่หนึ่งประกาศลำดับและอื่น ๆ อาร์เรย์เช่นในตัวอย่างนี้:

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

จากนั้นเกิดข้อผิดพลาดในการรวบรวมเวลา

ที่มา: ภาษาการเขียนโปรแกรม Javaสเปคที่ระยะทางเทคนิคเป็นมากกว่าคำทั่วไปvariable arity parametervarargs


22

สัญกรณ์สามจุด (... ) จริง ๆ แล้วยืมมาจากคณิตศาสตร์และมันหมายถึง "... และอื่น ๆ "

สำหรับการใช้งานใน Java มันvarargsหมายถึงหมายถึงจำนวนข้อโต้แย้งใด ๆ ที่สามารถเพิ่มการเรียกวิธีการ ข้อ จำกัด เพียงอย่างเดียวคือvarargsต้องเป็นตอนท้ายของลายเซ็นเมธอดและสามารถมีได้เพียงหนึ่งวิธี


5

สิ่งเหล่านี้varargsถูกใช้เพื่อสร้างวิธีที่ได้รับข้อโต้แย้งจำนวนหนึ่ง

ตัวอย่างเช่นเมธอดPrintStream.printfใช้มันเนื่องจากคุณไม่ทราบว่าคุณจะใช้อาร์กิวเมนต์จำนวนเท่าใด

สามารถใช้เป็นตำแหน่งสุดท้ายของการขัดแย้งเท่านั้น

varargsถูกเพิ่มในJava 1.5


3

มันหมายความว่าวิธีการที่ยอมรับจำนวนตัวแปรของการขัดแย้ง ( "varargs") JIDจากประเภท ภายในวิธีการrecipientJidsจะถูกนำเสนอ

สิ่งนี้มีประโยชน์สำหรับกรณีที่คุณมีวิธีการที่สามารถจัดการกับอาร์กิวเมนต์มากกว่าหนึ่งอย่างในแบบเป็นธรรมชาติและช่วยให้คุณสามารถเขียนการโทรที่สามารถผ่านพารามิเตอร์หนึ่งสองหรือสามไปยังวิธีเดียวกันโดยไม่ต้องสร้างความน่าเกลียด อาร์เรย์ได้ทันที

นอกจากนี้ยังเปิดใช้งานสำนวนเช่นsprintfจาก C; ดูString.format()ตัวอย่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.