2013-07-29 62 views
6

可變長度參數Java的多個可變長度參數

對於如工作時,我還沒有看到今天之前特別的事情,有一個與聲明這樣

的方法命名預備語句
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.另一種方法聲明

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

爲什麼java不允許多變量長度參數?還有其他方法可以實現嗎?

PS:之所以這樣做是我的要求是產生傳遞,參數廣義準備語句,因爲所有這些參數將通過屬性

+3

看看這個:http://stackoverflow.com/questions/2161912/why-varargs-should-be-the-last-in-method-signature –

回答

18

只有最後一個參數是允許爲可變長度:

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

串...則爲string []所以在這種情況下,你可以插入一個String []的第一個參數,只是檢查如果它是空的或多長時間。

編輯您的編輯

如果你真的需要爲所有的字符串作爲參數輸入,我會建議定義一個真的很罕見的字符串到單獨的輸入:

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

你可以叫它:

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

輸出:

abcde 
values 
fghijk 

另一種方法是,得到COLUMNNAMES作爲參數的長度,以及:

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

在呼叫進行:

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

和相同的輸出:

abcde 
values 
fghijk 
6

傳遞爲什麼Java的不允許多個可變長度論據??還有其他方法可以實現嗎?

我相信這個聲明:

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

如果調用方法

prepareStatement("x","y"); 

有沒有辦法解決"x""y"屬於哪個參數。

4

它只需要一個varlength參數,因爲如果有更多,它可能無法使用把他們分開。

讓我們來看看一些輸入第一個例子:

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

,並稱之爲:

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

雖然也許這將是合乎邏輯的被平分的論點,即可以」由編譯器承擔,因爲它不知道你有意將它拆分中間。爲了避免類型推理和粘性邊緣情況的混亂,即使對於不同的類型也不允許。

3

JVM會如何理解時String... columnNames結束並開始String... values如果你使用這樣的:

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

如果你不是很講究,使用字符串作爲參數,會比較容易採取的HashMap作爲參數。無需解析,也可以接受任意數量的參數。