第
												
												
														四
												
												
														道虎纹:
												
												
														可变参数
												
												
														机制
												
										
								
								
										
										
								
						
				
		
		
				
						 
						
								
								
						
				
		
		
				
						
								管中窥虎
						
				
				
						
						
				
				
						
								
								
						
				
		
		
				在学习
				
				
				java 1.5
				
				
				的过程中,我使用了
				
				
				sun
				
				
				公布的
				
				
				tutorial
				
				
				,这份文档写的比较详尽易明,但是对于想快速了解
				
				
				tiger
				
				
				而且具有较好
				
				
				java
				
				
				基础的人来说,大篇幅的英文文档是比较耗时间和非必需的,所以我将会归纳这份文档的主要内容,在保证理解的底线上,尽力减少阅读者需要的时间。
				
				
				
						
						
				
		
		
				
						 
				
		
		
				在以下地址可以进入各新增语言特色介绍以及下载相关文档(若有)。
				
				
				
						
						
				
		
		
				
						
								http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html 
						
						
						
				
		
		
				
						 
				
		
		
				
				
						2006
						年
						8
						月
						17
						日
				
				星期四
		
		
				
						Varargs
				
		
		
				(理解为
				var-args
				可变参数)
		
		
				在以前的版本里,一个接纳多个参数的方法,在调用前就需要用创建一个数组来放入这些参数,例如:
		
		
				
				
		
		
				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);
		
		现在依然必须这么传递,但varargs自动化并隐藏了这些步骤,而且还与已有的API兼容。之前的那个例子里,MessageFormat.format现在有了这样的声明:
		
		
		
				
						
						
				
		
		
				
						public
						 
						static
						 String format(String pattern,
                                Object
 arguments);
				 
				在最后一个参数的类型后面的那三个句号,说明了这个参数可以传入一个数组或者一串参数。注意只能是最后那个参数才能有这种用法。现在这个方法可以这样引用:
		
		
		
		
				
						
						
				
		
		
				
						
								
								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
								"
								);
						 
						 
				
		
		
				Autoboxing
				和varargs有着很强的配合关系,看看下面这些代码:
		
		
				
						 
				
		
		
		
		
				
						
						
				
		
		
				
						
						//
						 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);

    }
								
								
										
										
										
										
}
						
						
								
								
								
								
 
				 
				这个小程序可能是最小型的完整的测试框架了。getMethod和printf方法由于varargs的缘故而不需要声明数组来传参了。代码比以前会清洁很多。
		
		
				什么时候该用?作为客户端的话大可以好好利用,只要api里有提供,事实上java的核心api里的反射,信息格式化,和新的printf都用了varargs。而作为api的设计者,则应该谨慎地使用,只有你感觉到很有效果的时候才采取。总的来说,不要重载带varargs的方法,否则客户端程序员会很困惑哪个方法是被调用了。
		
	posted on 2006-08-17 18:09 
Ye Yiliang 阅读(1193) 
评论(0)  编辑  收藏  所属分类: 
Java