2010-10-18 32 views

Trả lời

10

này được gọi là Variadic function (trang wiki với các ví dụ trong nhiều languges).

Trong lập trình máy tính, một chức năng variadic là một chức năng không xác định thời arity, có nghĩa là mật mà chấp nhận một số biến các đối số. Hỗ trợ cho các hàm variadic khác nhau rộng rãi trong số các ngôn ngữ lập trình. Có nhiều hoạt động toán học và logic tự động xuất hiện như hàm variadic. Ví dụ: tổng hợp các số hoặc nối chuỗi hoặc các chuỗi khác là các hoạt động có thể áp dụng hợp lý cho bất kỳ số lượng toán hạng nào. Một hoạt động khác có được triển khai dưới dạng hàm variadic ở nhiều ngôn ngữ là đầu ra định dạng . Chức năng C printf và định dạng hàm Lisp thường là hai ví dụ như vậy. Cả hai tham số chỉ định định dạng của đầu ra và bất kỳ số nào của các đối số cung cấp giá trị cho được định dạng. Các hàm biến thể có thể phơi bày các vấn đề về an toàn loại ở một số ngôn ngữ . Ví dụ, printf của C, nếu được sử dụng vô tình, có thể làm phát sinh một lớp lỗ hổng bảo mật được gọi là các cuộc tấn công chuỗi định dạng .Cuộc tấn công là có thể vì hỗ trợ ngôn ngữ cho các hàm variadic không phải là loại an toàn; nó cho phép chức năng cố gắng bật nhiều đối số hơn ngăn xếp so với được đặt ở đó - làm hỏng ngăn xếp và dẫn đến hành vi không mong muốn . Variadic chức năng có thể được coi bổ sung cho các ứng dụng chức năng, mà phải mất một chức năng và một danh sách/dãy/mảng làm tham số và sau đó gọi hàm một lần, với đối số là các phần tử của danh sách .

Một trong tháng yêu thích cá nhân tính năng không được sử dụng trong Java. Về cơ bản nó là một mảng tham chiếu được xây dựng từ các phần tử. Một trong những cách tốt nhất để sử dụng nó là trên constructor lớp, hoặc phương pháp mà bạn cần phải liên tục tìm một giá trị như tối đa là 2, 3, 4, 5 yếu tố đầu vào.

Một ví dụ là, khi tôi xây dựng một chung binary tree node, cho các tác vụ mã hóa, tôi đã sử dụng điều này trong hàm tạo. Điều này cho phép tôi chỉ cần thêm các phần tử vào cây và phân phối chúng.

Sau tạo cây nhị phân kiểu chuỗi, với gốc "Red" và 2 chi nhánh "Blue""Green".

new MBTN<String>("Red", "Blue", "Green"). 

Bạn có thể nghĩ những lựa chọn thay thế sẽ là: D Bạn thậm chí không thể tạo ra các mảng nguyên tố chung, vì vậy điều này sẽ kéo dài như địa ngục. Nó chắc chắn không phải là vô dụng.

+0

Cảm ơn tất cả. Tôi hoàn toàn hiểu. Tôi đoán không biết điều này tôi sẽ chỉ sử dụng một String [] tại chỗ của nó. Nhưng bây giờ tôi có thể đọc mã người khác viết. – Jim

+0

"Bạn thậm chí không thể tạo ra các phần tử chung" Sau đó, bạn sẽ nhận được cảnh báo khi sử dụng vararg theo cách này, vì nó cũng sẽ cố tạo một mảng chung đằng sau hậu trường, nhưng không thể – newacct

+0

Tôi nên đề cập đến, rằng ** mới MBTN (Arrays.asList ("Red", "Blue", "Green")); ** sẽ được xem là tốt hơn. – Margus

14

Nó được gọi là varargs. Thực tế này sẽ mang lại better Google results.

+0

không dễ tìm kiếm nếu bạn không biết cách nó được gọi là ... –

+5

@Carlos: uhm, đó là lý do tại sao tôi trả lời nó được gọi như thế nào. – BalusC

0

Đó là phương pháp java lấy số biến số tùy ý của biến số

1

Chúng là các tham số độ dài thay đổi.

Dưới đây là một liên kết với một example.

3

Như @BalusC đề cập, đó là một tham số varags. Điều này có nghĩa là bạn có thể vượt qua một số biến đối số cho phương thức đó.

Vì vậy, cho một phương pháp định nghĩa là

public void foo(String...strings) { } 

Các lời gọi sau đây là hợp pháp:

foo(); 
foo("one param"); 
foo("one", "two", "three"); 
0

Nó có nghĩa là "số Arbitrary của lập luận" có nghĩa là bạn có thể vượt qua một số không rõ các thông số vào phương pháp ..

xem

http://download.oracle.com/javase/tutorial/java/javaOO/arguments.html Hãy tìm những "số Arbitrary các đối số" phần

public Polygon polygonFrom(Point... corners) { 
    int numberOfSides = corners.length; 
    double squareOfSide1, lengthOfSide1; 
    squareOfSide1 = (corners[1].x - corners[0].x)*(corners[1].x - corners[0].x) 
      + (corners[1].y - corners[0].y)*(corners[1].y - corners[0].y) ; 
    lengthOfSide1 = Math.sqrt(squareOfSide1); 
    // more method body code follows that creates 
    // and returns a polygon connecting the Points 
} 
1

Như đã đề cập bởi tất cả mọi người ... đối số biến (hoặc varargs) cho phép bạn làm điều này ....

//Method we're using for varargs 
public void doSomething(String... datas) { 
    if (datas == null || datas.length == 0) { 
     System.out.println("We got nothing"); 
    } else { 
     for (String data: datas) { 
      System.out.println(data); 
     } 
    } 
} 

Do đó, tất cả những cuộc gọi đề cập dưới đây có giá trị ....

String d[] = {"1", "2", "3"}; 
doSomething(d); //An array of String, as long as the type is exactly as the varargs type. 

//OR 
doSomething("1", "2", "3", "4"); //I can add "infinitely" many arguments as the JVM can allocate me.... 

//OR 
doSomething("1"); //Exactly 1; 

Vòm bên trong là "cơ bản" là một mảng tham chiếu của loại được khai báo.

6

Chúng là "đối số biến" hoặc varargs (viết tắt).

Về cơ bản nó cho phép sự ra đi của một số không xác định Strings, vì vậy phương pháp chữ ký

public void printStuff(String...messages) 

có hiệu quả có thể xử lý các cuộc gọi sau

printStuff("hi"); 
printStuff("hi", "bye"); 
printStuff("Hello", "How are you?", "I'm doing fine.", "See you later"); 

Bạn có hiệu quả có thể coi đây là một loại autoboxing. Đối số printStuff có thể được xem như một mảng, do đó, printStuff(String...messages) được xử lý khái niệm như printStuff(String[] messages). Wtih các cuộc gọi trên một cách hiệu quả hành động như

printStuff(new String[] {"hi"}); 
printStuff(new String[] {"hi", "bye"}); 
printStuff(new String[] {"Hello", "How are you?", "I'm doing fine.", "See you later"}); 

Để truy cập vào các thông điệp trong nội bộ, bạn sử dụng điển hình List xử lý nguyên thủy.Một cái gì đó như

... 
if (messages != null) { 
    for (String message : messages) { 
    System.out.println(message); 
    } 
} 
... 

Điều đó không cần thiết phải tạo mảng là một chút đường cú pháp được thêm vào Java với sự ra đời của tự động đấm bốc.

+0

Xin chào, tôi chỉ truyền một tham số, cách truy cập thông số đó. –

+0

@Sridhar Khi chỉ truyền một tham số, nó trở thành phần tử đầu tiên (và duy nhất) trong mảng. –

+0

Cảm ơn bạn đã trả lời tôi đã nhận. chúng ta có thể nhận được đối số đầu tiên là tin nhắn [0]. –

Các vấn đề liên quan