2013-07-29 61 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作为参数。无需解析,也可以接受任意数量的参数。