xem xét chữ ký phương pháp sau đây:mảng Object trong chữ ký phương pháp
public fooMethod (Foo[] foos) { /*...*/ }
và
public fooMethod (Foo... foos) { /*...*/ }
Giải thích: Các cựu mất một mảng của Foo-đối tượng như một cuộc tranh cãi - fooMethod(new Foo[]{..})
- trong khi sau này lấy một số lượng đối số tùy ý của loại Foo, và trình bày chúng như là một mảng của Foo: s trong phương thức - fooMethod(fooObject1, fooObject2, etc...
).
Java ném phù hợp nếu cả hai được xác định, tuyên bố rằng chúng là phương thức trùng lặp. Tôi đã làm một số công việc thám tử, và phát hiện ra rằng tuyên bố đầu tiên thực sự đòi hỏi một mảng rõ ràng của các đối tượng Foo, và đó là cách duy nhất để gọi phương thức đó. Cách thứ hai thực sự chấp nhận cả số lượng đối số Foo tùy ý VÀ cũng chấp nhận một mảng các đối tượng Foo.
Vì vậy, câu hỏi là, vì phương pháp thứ hai có vẻ linh hoạt hơn, có bất kỳ lý do nào để sử dụng ví dụ đầu tiên hoặc tôi đã bỏ lỡ bất kỳ điều gì quan trọng không?
Không biết Java, đây là cú đâm trong bóng tối, nhưng tôi cho rằng đầu tiên là hiệu quả hơn, bởi vì: a) bạn sẽ chỉ chuyển một con trỏ xung quanh, và b) bạn sẽ chuyển một con trỏ đến phần tiếp giáp của bộ nhớ. –
@monoxide: Không, cả hai biểu mẫu tạo ra bytecode gọi tương đương, cả hai biểu mẫu đều yêu cầu tạo một mảng để truyền. –
Dạng thứ hai chỉ đơn giản là cú pháp đường cho lần đầu tiên. Vì vậy, fooMethod (mới Foo (1), mới Foo (2)) là ở đây giống với fooMethod (new Foo [] {new Foo (1), new Foo (2)}) –