Java多变量长度参数

Akh*_*ain 6 java methods android 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)
Run Code Online (Sandbox Code Playgroud)

2.另一种方法声明

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

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

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

Lok*_*oki 18

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

String prepareStatement(String[] columnNames, String... values)
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

你可以称之为:

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

输出:

abcde
values
fghijk
Run Code Online (Sandbox Code Playgroud)

另一种方法是将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;
}
Run Code Online (Sandbox Code Playgroud)

通过电话:

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

和相同的输出:

abcde
values
fghijk
Run Code Online (Sandbox Code Playgroud)


NIN*_*OOP 5

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

我相信这个宣言:

String prepareStatement(String... columnNames,String... values) 
Run Code Online (Sandbox Code Playgroud)

如果您调用该方法

prepareStatement("x","y");
Run Code Online (Sandbox Code Playgroud)

没有办法解决"x""y"属于哪个论点.