2013-07-29 32 views
6

Tôi đã không nhìn thấy điều đặc biệt trước ngày hôm nay khi làm việc trên lập luận chiều dài biếnJava nhiều độ dài thay đổi lập luận

Đối với ví dụ: Có một phương thức có tên tuyên bố chuẩn bị với tuyên bố như vậy mà

1.

String prepareStatement(String... columnNames,String... values) 
//String... columnNames(Eclipse shows error saying The variable argument type String of the method prepareStatement must be the last parameter) 

2. Một phương pháp kê khai

String prepareStatement(int i,String... columnNames,String... values) 
    //still the same result as above(The variable ...... parameter) 

Tại sao java không cho phép nhiều đối số độ dài thay đổi ?? Có cách nào khác để đạt được điều đó không?

PS: Lý do để làm như vậy là yêu cầu của tôi là để tạo ra khái quát hóa tuyên bố chuẩn bị cho tham số trôi qua, kể từ khi tất cả các tham số này sẽ được chuyển qua tính

+3

Kiểm tra điều này: http://stackoverflow.com/questions/2161912/why-varargs-should-be-the-last-in-method-signature –

Trả lời

18

Chỉ Parameter cuối cùng được phép có biến Length:

String prepareStatement(String[] columnNames, String... values) 

Chuỗi ... được bằng String [] như vậy trong trường hợp này bạn có thể chèn một String [] cho tham số đầu tiên và chỉ cần kiểm tra nếu nó trống rỗng hoặc trong bao lâu.

Edit để chỉnh sửa của bạn

Nếu bạn thực sự cần một đầu vào cho tất cả các Strings của bạn như thông số Tôi muốn giới thiệu để xác định một chuỗi thực sự rất phổ biến để tách đầu vào của bạn:

static String prepareStatement(String... params) 
{ 
    String ret = ""; 
    boolean valueInput = false; 
    for(String s : params) 
    { 
     if(s.equals("MyReallyUncommonSeperateString")) 
     { 
      valueInput = true; 
      ret+="\nvalues\n";//visual delimiter of columnNames and Values 
     } 
     else if(valueInput) 
     { 
      //handling of your value inputs 
      ret+=s; //example handling, concatenate everything 
     } 
     else 
     { 
      //handling of your columnnames 
      ret+=s; //example handling, concatenate everything 
     } 
    } 
    return ret; 
} 

Bạn có thể gọi nó là:

System.out.println(prepareStatement("a","b","c","d","e","MyReallyUncommonSeperateString","f","g","h","i","j","k")); 

Output:

abcde 
values 
fghijk 

Một cách khác là để cho độ dài của COLUMNNAMES như tham số cũng như:

static String prepareStatement(int length, String... params) 
{ 
    String ret = ""; 
    for(int i = 0; i < length; i++){ 
     //handling of columnnames 
     String colName = params[i]; 
     //do something with colName 

     ret+=colName; //example handling, concatenate everything 
    } 
    ret+="\nvalues\n";//visual delimiter of columnNames ans Values 
    for(int i = length; i < params.length; i++){ 
     String value = params[i]; 
     //do something with values 

     ret+=value; //example handling, concatenate everything 
    } 

    return ret; 
} 

Với cuộc gọi:

System.out.println(prepareStatement(5, "a","b","c","d","e","f","g","h","i","j","k")); 

Và cùng đầu ra:

abcde 
values 
fghijk 
6

Tại sao java không cho phép nhiều độ dài thay đổi tranh luận?? Có cách nào khác để đạt được điều đó không?

Tôi tin rằng với tuyên bố này:

String prepareStatement(String... columnNames,String... values) 

Nếu bạn gọi phương pháp như

prepareStatement("x","y"); 

Không có cách nào để giải quyết "x""y" thuộc mà tranh cãi.

4

Nó đòi hỏi chỉ có một đối số varlength bởi vì nếu có nhiều hơn nó có thể không có khả năng để phân biệt chúng.

Hãy nhìn vào ví dụ đầu tiên với một số đầu vào:

String prepareStatement(String... columnNames,String... values) 

và gọi nó với:

String prepareStatement("foo", "bar", "baz", "foov", "barv", "bazv"); 

Trong khi có lẽ nó sẽ là hợp lý cho các đối số được chia đều cho rằng có thể' t được giả định bởi trình biên dịch vì nó không biết ý định của bạn có nó được chia nhỏ ở giữa. Để tiết kiệm chính nó từ một loại lộn xộn của loại inferring và dính trường hợp, nó không cho phép điều này ngay cả đối với các loại khác nhau.

3

Làm thế nào JVM sẽ hiểu khi String... columnNames kết thúc và bắt đầu String... values nếu bạn sử dụng nó như thế này:

prepareStatement("one", "two", "three"); 
0

Nếu bạn không phải là rất cụ thể về việc sử dụng chuỗi như các thông số, sẽ dễ dàng hơn để có HashMap như một tham số . Không cần phân tích cú pháp và có thể lấy số tham số bất kỳ.

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