Java多变量长度参数

时间:2013-07-29 13:10:54

标签: java android methods variadic-functions method-declaration

在今天处理变长参数

之前,我还没有看到过特定的事情

例如,有一个名为prepared statement的方法,声明为

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. 另一种方法声明

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

为什么java不允许多个变量长度参数?还有其他方法可以实现吗?

P.S:这样做的原因是我的要求是为传递的参数生成通用的预准备语句,因为所有这些参数都将通过属性传递

5 个答案:

答案 0 :(得分:18)

只允许最后一个参数变长:

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

String ...等于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

答案 1 :(得分:5)

  

为什么java不允许多个变量长度参数?还有其他方法可以实现吗?

我相信这个宣言:

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

如果您将方法调用为

prepareStatement("x","y");

无法解决"x""y"属于哪个参数。

答案 2 :(得分:4)

它要求只有一个varlength参数,因为如果有更多参数,它可能无法区分它们。

让我们看看第一个带有一些输入的例子:

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

并将其命名为:

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

虽然参数可能被均匀地分割是合乎逻辑的,但是编译器不能假设它,因为它不知道你打算将它分成中间的意图。为了避免乱七八糟的类型推断和粘性边缘情况,它甚至不允许这种情况。

答案 3 :(得分:3)

JVM如何理解String... columnNames何时结束并启动String... values如果你这样使用它:

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

答案 4 :(得分:0)

如果您不是非常特别关注使用字符串作为参数,那么将HashMap作为参数更容易。无需解析,也可以使用任意数量的参数。