有人问我两种方法参数之间的区别以及为什么会使用其中一种而不是专门分配的数组。
putMessage(byte ...send)
putMessage(byte[] send)
我无法自信地回答他们,并且无法记住...的名称。
...
被称为可变参数。你的第二个例子有一个数组参数。Varargs是一种便利方式,当你想在一个方法中硬编码变量数量的参数,但不想手动创建一个数组来保存它们时使用。这是一种简写符号。考虑这个例子:putMessage(0b00100101, 0b00100101, 0b00100101); // varargs
与这个相比:
putMessage(new byte[] { 0b00100101, 0b00100101, 0b00100101 }); // array
public void printStr(String ...strings) {
for (String s : strings) {
System.out.println(s);
}
}
> printStr("Hello", "World")
Hello
World
省略号(三个点)表示您正在使用“可变参数”。
有关更多详细信息,请参见http://download.oracle.com/javase/1,5.0/docs/guide/language/varargs.html。
在方法内部,您可以将“send”的元素作为数组访问。就这方面而言,这两种方法是相同的。方便之处在于调用者。在第二个putMessage中,调用者被迫创建一个字节数组以传递给putMessage。在第一个putMessage中,调用者可以简单地说“putMessage(byte1, byte2)”或“putMessage(byte1, byte2, byte3)”或“putMessage(byte1)”-- 可变数量的参数,或可变参数。
省略号(...)允许您在调用函数时内联 N 个类型的参数,而无需先定义数组。最终,您只是得到一个参数数组,但它基本上是一种简写或语法糖。此外,使用省略号语法,您的客户端代码可能会更加清晰和声明式......尽管它很容易变得混乱和难以阅读。
这里有一个很好的例子省略号语法(可变长度参数列表)。在查看示例时,请考虑如果使用数组而不是可变长度参数列表,主函数中的客户端代码将会是什么样子。