本帖最后由 Morgan 于 2015-7-4 20:16 编辑
在过去的释出版本中,一个方法需要随意的数量的值作为参数,需要你提前创建一个数组并把值放入数组中然后调用这个方法。例如下面就是一个这样用的消息格式类来格式化消息:- Object[] arguments = {
- new Integer(7),
- new Date(),
- "a disturbance in the Force"
- };
- String result = MessageFormat.format(
- "At {1,time} on {1,date}, there was {2} on planet "
- + "{0,number,integer}.", arguments);
复制代码 目前为止多重参数必须被放入数组中传递,但是可变参数特性自动做了处理并隐藏了处理过程。不仅如此,新特性向上兼容已经存在的API代码。所以例如MessageFormat.format方法现在是这样声明的:
- public static String format(String pattern,Object... arguments);
复制代码 最后参数类型后面的三个句号表明最后参数可以被作为数组或者参数序列传入。可变参数只能被使用在最后一个参数位置上。给出MessageFormat.format的新的可变参数声明,上面的调用可以被替换为下面的更短的更甜美的调用:
- String result = MessageFormat.format(
- "At {1,time} on {1,date}, there was {2} on planet "
- + "{0,number,integer}.",
- 7, new Date(), "a disturbance in the Force");
复制代码 自动装箱和可变参数可以产生协同作用,下面的使用反射的程序说明了这一点:
- // Simple test framework
- public class Test {
- public static void main(String[] args) {
- int passed = 0;
- int failed = 0;
- for (String className : args) {
- try {
- Class c = Class.forName(className);
- c.getMethod("test").invoke(c.newInstance());
- passed++;
- } catch (Exception ex) {
- System.out.printf("%s failed: %s%n", className, ex);
- failed++;
- }
- }
- System.out.printf("passed=%d; failed=%d%n", passed, failed);
- }
- }
复制代码 这个小程序很小的测试框架。它从命令行获取一个类名列表。对每一个类名使用它的无参的构造器实例化对象,并调用一个无参的test方法。如果实例化和调用抛出了一个异常。测试被认为失败了。程序打印每次失败,后跟一个测试结果的总结。反射的实例化和调用不再需要明确的数组创建,因为getMethod方法和 invoke方法接受一个可变参数列表。程序也使用了一个新的printf功能,他爷依赖于可变参数。比起没有可变参数列表程序读起来更加自然。
那么什么时候你因该使用可变参数列表?作为一个客户,你因该充分利用他们,只要API提供了他们。在核心API的重要使用包括反射,消息格式化和新的Printf机制。作为一个API设计者你因该保守的使用它,只有优点确实很引人注目的时候。一般来说你不应该重载一个可变参数方法,否则程序猿将很难理清楚哪一个重载的方法被调用了。
|
|