随笔 - 17  文章 - 49  trackbacks - 0
<2006年8月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(1)

随笔分类(17)

随笔档案(17)

相册

最新随笔

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

道虎纹: 参数 机制

 

管中窥虎

在学习 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);

    }


}


 

这个小程序可能是最小型的完整的测试框架了。getMethodprintf方法由于varargs的缘故而不需要声明数组来传参了。代码比以前会清洁很多。

什么时候该用?作为客户端的话大可以好好利用,只要api里有提供,事实上java的核心api里的反射,信息格式化,和新的printf都用了varargs。而作为api的设计者,则应该谨慎地使用,只有你感觉到很有效果的时候才采取。总的来说,不要重载带varargs的方法,否则客户端程序员会很困惑哪个方法是被调用了。

posted on 2006-08-17 18:09 Ye Yiliang 阅读(1150) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: