在今天处理变长参数
之前,我还没有看到过特定的事情例如,有一个名为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:这样做的原因是我的要求是为传递的参数生成通用的预准备语句,因为所有这些参数都将通过属性传递
答案 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作为参数更容易。无需解析,也可以使用任意数量的参数。