本站首页    管理页面    写新日志    退出


«September 2025»
123456
78910111213
14151617181920
21222324252627
282930


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7622482
建立时间:2006年5月29日




[J2SE]可变参数机制
软件技术

lhwork 发表于 2006/8/21 10:05:32

管中窥虎 在学习 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,                                Object500)this.width=500'> arguments); 在最后一个参数的类型后面的那三个句号,说明了这个参数可以传入一个数组或者一串参数。注意只能是最后那个参数才能有这种用法。现在这个方法可以这样引用: 500)this.width=500'> String result  =  MessageFormat.format(500)this.width=500'>500)this.width=500'>     " At {1,time} on {1,date}, there was {2} on planet  " 500)this.width=500'> 500)this.width=500'>     +   " {0,number,integer}. " ,500)this.width=500'>500)this.width=500'>     7 ,  new  Date(),  " a disturbance in the Force " );500)this.width=500'>   Autoboxing 和varargs有着很强的配合关系,看看下面这些代码:   500)this.width=500'> //  Simple test framework 500)this.width=500'> 500)this.width=500'> 500)this.width=500'> public   class  Test  500)this.width=500'> {500)this.width=500'>500)this.width=500'>500)this.width=500'>     public   static   void  main(String[] args)  500)this.width=500'> {500)this.width=500'>500)this.width=500'>         int  passed  =   0 ;500)this.width=500'>500)this.width=500'>         int  failed  =   0 ;500)this.width=500'>500)this.width=500'>500)this.width=500'>         for  (String className : args)  500)this.width=500'> {500)this.width=500'>500)this.width=500'>500)this.width=500'>             try   500)this.width=500'> {500)this.width=500'>500)this.width=500'>                Class c  =  Class.forName(className);500)this.width=500'>500)this.width=500'>                c.getMethod( " test " ).invoke(c.newInstance());500)this.width=500'>500)this.width=500'>                passed ++ ;500)this.width=500'>500)this.width=500'>500)this.width=500'>            }   catch  (Exception ex)  500)this.width=500'> {500)this.width=500'>500)this.width=500'>                System.out.printf( " %s failed: %s%n " , className, ex);500)this.width=500'>500)this.width=500'>                failed ++ ;500)this.width=500'>500)this.width=500'>            } 500)this.width=500'> 500)this.width=500'>        } 500)this.width=500'> 500)this.width=500'>        System.out.printf( " passed=%d; failed=%d%n " , passed, failed);500)this.width=500'>500)this.width=500'>    } 500)this.width=500'> 500)this.width=500'>} 500)this.width=500'> 500)this.width=500'> 500)this.width=500'> 这个小程序可能是最小型的完整的测试框架了。getMethod和printf方法由于varargs的缘故而不需要声明数组来传参了。代码比以前会清洁很多。 什么时候该用?作为客户端的话大可以好好利用,只要api里有提供,事实上java的核心api里的反射,信息格式化,和新的printf都用了varargs。而作为api的设计者,则应该谨慎地使用,只有你感觉到很有效果的时候才采取。总的来说,不要重载带varargs的方法,否则客户端程序员会很困惑哪个方法是被调用了。


阅读全文(1646) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.063 second(s), page refreshed 144806367 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号