服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

jbuilder2005实现重构之升级到jdk5.0


  jdk 5.0在语法上做许多重大的改进,虽然在低版本jdk中开发的源代码几乎可以不做任何修改就可直接运行于jdk 5.0中。但还是有必须进行版本升级的重构,这样就可以应用jdk 5.0的for和while循环、自动装/拆箱、泛型等改进功能,在使代码更加紧凑的同时,使代码性能得到优化。所以jbuilder专门为低版本提升到jdk 5.0的程序提供了3个重构功能,方便你无缝地实现升级。

  1、使工程基于jdk 5.0

  虽说jbuilder 2005支持jdk 5.0,但其默认的jdk版本是1.4.2,要使工程的jdk版本为5.0,你必须安装jdk 5.0,并在jbuilder下进行相应的设置。关于jdk 5.0的详细设置我们不作过多的描述,简而言之,它主要包括以下的步骤:

  1) 安装jdk 5.0(从http://java.sun.com/j2se/1.5.0/download.jsp下载)。

  2) tools->configure->jdks...通用指定jdk5.0的安装路径设置jdk。

  3) project->project properties...->在paths设置页,将jdk设置为jdk 5.0。

  4) project->project properties...->build->在java设置页,将language features:设置为java 2 sdk,v 5.0(generics enabled),将target vm设置为java 2 sdk,v 5.0 and later。

  只有将工程的jdk版本设置为jdk 5.0,才可以进行有关jdk 5.0的代码重构。

  2、优化循环

  jdk 5.0引入了更高效的循环,称之为jdk 5.0样式的循环,包括:

  ?数组遍历

  ?list遍历

  ?iterator的for循环

  ?iterator的while循环

  jbuilder提供了将低版本jdk对应的循环代码转换这jdk5.0循环风格的重构方法,我们通过一个数组遍历的重构对此做说明,请看下面的低版本jdk循环代码:

  代码清单 11 低版本循环样式

1. public static void arraylooprefactoring()
2. {
3.  int[] myarray = {1 , 2 , 3 , 4} ;
4.  for(int x = 0 ; x < myarray.length ; x++) {
5.   system.out.println(myarray[x]) ;
6.  }
7. }

  将光标移到第4行的for(int x = 0 ; x < myarray.length ; x++) 中间:ctrl+shift+r->introduce foreach调出循环重构对话框:

           jbuilder2005实现重构之升级到jdk5.0(图一)
                  图 22 循环重构对话框

  在loop variable name中为数组循环临时变量指定一个变量名,这里我们设置为item,按ok完成重构,jbuilder生成jdk 5.0风格循环代码,如下所示:

  代码清单 12 jdk 5.0样式循环

1. public static void arraylooprefactoring()
2. {
3.  int[] myarray = {1 , 2 , 3 , 4} ;
4.  for(int item : myarray) {
5.   system.out.println(item) ;
6.  }
7. }
3、自动装/拆箱

  每个基本数据类型如double、int都有对应的封装类double、integer,在低版本的jdk中,需要一些无聊的代码完成基本数据类型到对应封装类的转换。jdk 5.0的自动装/拆箱特性可以自动完成这种转换,使代码更加简洁,来看下面未用自动装/拆箱的代码:

  代码清单 13 未使用自动装/拆箱的代码

1. package myrefactor ;
2. public class jdk5
3. {
4. …
5. public static void autoboxingpreliminary(integer intobject)
6. {
7. system.out.println(intobject) ;
8. }
9.
10. public static void autoboxingrefactoring()
11. {
12. autoboxingpreliminary(new integer(8)) ;
13. }
14. …
15. }

  第5~8行定义的autoboxingpreliminary()方法需要一个integer的入参,autoboxingrefactoring()在第12行老老实实满足了这种要求。jbuilder提供了一个非常方便进行自动装/拆箱重构的方法,打开需要做此重构的类,在编辑器的任何地方:ctrl+shift+r->introduce auto(un)boxing,jbuilder搜索当前class文件需要自动装/拆箱的地方,一并重构。如上面的代码段进行自动装/拆箱重构后,将调用为:

  代码清单 14 自动装/拆箱重构后的代码

1. package myrefactor ;
2. public class jdk5
3. {
4.  …
5.  public static void autoboxingpreliminary(integer intobject)
6.  {
7.   system.out.println(intobject) ;
8.  }
9.
10.  public static void autoboxingrefactoring()
11.  {
12.   autoboxingpreliminary(8) ;
13.  }
14.  …
15. }

  第12行直接传入8而非new integer(8),代码工整了许多。

  4、非泛型转泛型

  在低版本中,集合中的对象在使用前需要进行显示的类型转换,如string s = (string)iter.next(),jdk 5.0引入了泛型的概念,加入了编译期类型安全检查,取消了强制类型转换,节省了代码,下面是大家熟悉的传统的list操作代码:

  代码清单 15 非泛型的代码

1. public static void genericsarraylist()
2. {
3.  list list = new arraylist() ;
4.  list.add(0 , new integer(23)) ;
5.  int total = ( (integer) list.get(0)).intvalue() ;
6.  system.out.println(total) ;
7. }

  将光标移到第3行(即集合定义的代码行):ctrl+shift+r->introduce generics调出泛型重构对话框:

           jbuilder2005实现重构之升级到jdk5.0(图二)
                   图 23 泛型重构对话框

  在type argument中指定一个数据类型,jbuilder已经通过分析代码默认了最适合的数据类型,一般情况下无需调整。按ok后完成泛型的代码重构:

  代码清单 泛型的代码

1. public static void genericsarraylist()
2. {
3.  listlist = new arraylist() ;
4.  list.add(0 , new integer(23)) ;
5.  int total = (list.get(0)).intvalue() ;
6.  system.out.println(total) ;
7. }

  注意第3行和第5行代码的变化。也许有人会指出第4行应该调整为list.add(23)才对啊?是的,只需要你调用前一小节的自动装/拆箱重构就可以完成这样的转换了。

扫描关注微信公众号