Dấu chấm lửng (chụp) trong chữ ký phương thức này là gì?


203

Trong tài liệu của Máy ứng dụng , dấu chấm lửng là gì (JID... ) cho chữ ký phương thức này là gì?

public MessageBuilder withRecipientJids(JID... recipientJids)

Chức năng của ba chấm đó là gì?


7
Nhân tiện, tôi đã thử ký tự HORIZONTAL ELLIPSIS , Unicode U + 2026. NetBeans 8 trong Java 8 báo cáo "ký tự không hợp lệ". Vì vậy, các vararg Java yêu cầu bộ ba FULL STOP (dấu chấm) , ....
Basil Bourque

Câu trả lời:


208

Đó là các varargs Java. Chúng cho phép bạn vượt qua bất kỳ số lượng đối tượng của một loại cụ thể (trong trường hợp này chúng thuộc loại JID).

Trong ví dụ của bạn, các lệnh gọi hàm sau sẽ hợp lệ:

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

Xem thêm tại đây: http://java.sun.com/j2se/1.5.0/docs/guide/lingu/varargs.html


16
Lưu ý rằng các đối số cũng có thể được chuyển qua dưới dạng một mảng của JID (điều này làm cho các varargs tương thích ngược).
mjn

54
Cũng lưu ý rằng việc chuyển 0 varargs (không có gì) là hợp pháp.
Hawkeye Parker

9
Cuối cùng nhưng không kém phần quan trọng, vararg phải là tham số cuối cùng của phương thức. Vì vậy, bạn không thể có hai tham số vararg trong cùng một phương thức. Có lẽ, bạn có thể tìm thấy phương pháp này thú vị docs.oracle.com/javase/7/docs/api/java/util/ mẹo
BlackBrain 17/08/2015

62

Cách sử dụng dấu chấm lửng hoặc varargs bên trong phương thức như thể nó là một mảng:

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

Phương pháp này có thể được gọi như sau:

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

Bên trong PrintWithEllipsis, loại setOfStringslà một mảng của Chuỗi. Vì vậy, bạn có thể lưu trình biên dịch một số công việc và vượt qua một mảng:

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

Đối với các phương thức varargs , một tham số chuỗi được coi là một mảng cùng loại. Vì vậy, nếu hai chữ ký chỉ khác nhau ở chỗ một chữ ký khai báo một dãy và mảng kia, như trong ví dụ này:

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

sau đó xảy ra lỗi thời gian biên dịch.

Nguồn: Đặc tả ngôn ngữ lập trình Java , trong đó thuật ngữ kỹ thuật variable arity parameterthay vì thuật ngữ chung varargs.


22

Ký hiệu ba chấm (...) thực sự được mượn từ toán học, và nó có nghĩa là "... vân vân".

Đối với việc sử dụng nó trong Java, nó varargscó nghĩa là, có nghĩa là bất kỳ số lượng đối số nào có thể được thêm vào cuộc gọi phương thức. Các hạn chế duy nhất là varargsphải ở cuối chữ ký phương thức và chỉ có thể có một cho mỗi phương thức.


5

Chúng được varargssử dụng để tạo ra một phương thức nhận bất kỳ số lượng đối số nào.

Chẳng hạn, phương thức PrintStream.printf sử dụng nó, vì bạn không biết sẽ sử dụng bao nhiêu đối số.

Chúng chỉ có thể được sử dụng như là vị trí cuối cùng của các đối số.

varargsđã được thêm vào Java 1.5


3

Điều đó có nghĩa là phương thức chấp nhận một số lượng đối số ("varargs") khác nhau JID. Trong phương pháp, recipientJidsđược trình bày.

Điều này rất hữu ích cho các trường hợp bạn có một phương thức có thể tùy ý xử lý nhiều hơn một đối số theo cách tự nhiên và cho phép bạn viết các cuộc gọi có thể truyền một, hai hoặc ba tham số cho cùng một phương thức, mà không có sự xấu xí khi tạo một mảng trên bay.

Nó cũng cho phép các thành ngữ như sprintftừ C; xem String.format(), ví dụ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.