6

在处理可变长度参数时,我在今天之前还没有看到特定的东西

例如,有一个名为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不允许多个可变长度参数?还有其他方法可以实现吗?

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

4

5 回答 5

18

只允许最后一个 Parameter 是可变长度:

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
于 2013-07-29T13:13:11.363 回答
5

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

我相信这个宣言:

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

如果您将该方法调用为

prepareStatement("x","y");

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

于 2013-07-29T13:13:08.793 回答
4

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

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

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

并调用它:

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

虽然将参数平均拆分可能是合乎逻辑的,但编译器不能假设,因为它不知道您将其拆分为中间的意图。为了避免混乱的类型推断和棘手的边缘情况,即使对于不同的类型,它也不允许这样做。

于 2013-07-29T13:13:19.590 回答
3

如果您像这样使用它,JVM 将如何理解何时String... columnNames结束和开始:String... values

prepareStatement("one", "two", "three");
于 2013-07-29T13:13:24.607 回答
0

If you are not very particular about using string as the parameters, will be easier to take HashMap as a parameter. No need of parsing and can take any number of parameters as well.

于 2013-07-29T14:04:38.573 回答