站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题J2SE1.5的变化

J2SE1.5的变化

摘要: J2SE1.5的变化
J2SE 1.5(开发代号“Tiger”)是Java平台和语言上的一个重要修改,在这里记录其主要的修改
其中swing Api的修改是最大的,但是对Swing没什么研究,所以只把原文记录如下:
http://java.sun.com/j2se/1.5.0/docs/guide/swing/1.5/index.html

总体变化的原文连接如下:
http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html

语言变化简介:
1、Generics(范型):
有关java和范性,在IBM Development上有篇不错的文章
http://www-900.cn.ibm.com/developerWorks/cn/java/Java_and_Generics/index.shtml
sun有一篇相关的文章,Generics in the Java Programming Language:
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

2、Enhanced for Loop(增强的循环语句):

  代码示例

  一个典型的遍历数组的循环语句,1.5版本以前的写法是:

for ( Iterator iterator = list.iterator(); iterator.hasNext(); )

{

Integer n = (Integer)iterator.next();

...

}//for

  而在1.5版本中可以写为:

for ( Integer n : list )

{

...

}//for

  显然1.5版本的写法比以前是大大简化了,但是在需要修改集合,比如删除其中元素时不能采用这种写法。之所以Java1.5版本没有象C#那样干脆定义一个foreach关键词,主要是因为SUN认为增加一个专门的关键词成本太高了(too costly)。但1.4版本中就曾经增加了assert关键词,1.5版本中也新增加了enum关键词,因此这一解释恐怕并不那么令人信服。

3、AutoBoxing/UnBoxing(自动包装和解包):

  代码示例

  往一个ArrayList中加入一个整数,1.5版本以前的版本写法是:

List list = new ArrayList();

list.add( new Integer( 10 ) );

  而在1.5版本中可以写为:

list.add( 10 );

  因为,在1.5版本中,对一个整数进行包装,使之成为一个Integer对象(即包装,boxing),然后加入到一个ArrayList中的做法被认为是没有必要的,反之,解包(unboxing)的做法也是没有必要的,这样的代码只是增加了程序的文本长度而已,所以1.5版本支持了自动包装和解包操作,对于bool/Boolean,byte/Byte,double/Double,short/Short,int/Integer,long/Long,float/Float的相应包装/解包操作都进行了支持,从而使代码变得简单。

3、Typesafe Enums(枚举):

  代码示例

  构建一个表示色彩的枚举,并赋值,在1.5版本中可以写为:

public enum MyColor{ Red, Yellow, Blue }

MyColor color = MyColor.Red;
for ( MyColor mycolor : MyColor.values() )
 System.out.println( mycolor );

  以往的Java版本中没有enum关键词,1.5版本中终于加入了进来,这确实是一个令人高兴的改进。此外,enum还提供了一个名为values()的静态方法,用以返回枚举的所有值的集合。所以,以上程序的输出结果是把“Red”、“Yellow”、“Blue”分行输出。

  而enum提供的静态方法valueOf()则将以字符串的形式返回某一个具体枚举元素的值,比如“MyColor.valueOf( “Red” )”会返回“Color.Red”。静态方法name()则返回某一个具体枚举元素的名字,比如“MyColor.Red.name()”会返回“Red”。类似的方法还有不少。此外,enum自身还可以有构造方法。

4、Varargs(参数可变的方法和printf):

  代码示例

  当不能确定一个方法的入口参数的个数时,以往版本的Java中,通常的做法是将多个参数放在一个数组或者对象集合中作为参数来传递,1.5版本以前的写法是:

int sum(Integer[] numbers)
{
 int nSum = 0;
 for(int i: numbers)
  nSum += i;
  return nSum;
}
...
//在别处调用该方法

sum(new Integer[] {12,13,20});

  而在1.5版本中可以写为:

int sum(Integer... numbers)

{

int nSum = 0;

for(int i: numbers)

nSum += i;

return nSum;

}

...

//在别处调用该方法

sum(12,13,20);

  显然,1.5版本的写法更为简易,也更为直观,尤其是方法的调用语句,不仅简化很多,而且更符合通常的思维方式,更易于理解。

  1.5版本自身就有一个应用该特征的典型例子,即C风格的格式化输出方法——printf。

  代码示例

  输出一个加法算式,1.5版本以前的写法是:

int x = 5;

int y = 7;

int nSum = x + y;

System.out.println(x + " + " + y + " = " + nSum);

  而在1.5版本中可以写为:

System.out.printf("%d + %d = %d\n", x, y, nSum);

  以上两种写法的输出结构是一样的,即“5 + 7 = 12”。

  这种改变不仅仅是形式上的,printf还可以提供更为灵活、强大的输出功能,比如限定按照两位整数的形式输出,可以写为“System.out.printf("%02d + %02d = %02d\n", x, y, nSum);”,输出结果将是“05 + 07 = 12”。

5、Static Import(静态引用):

  代码示例

  当我们要获取一个随即数时,1.5版本以前的写法是:

import java.lang.Math; //程序开头处

...

double x = Math.random();

  而在1.5版本中可以写为:

import static java.lang.Math.random; //程序开头处



double x = random();

  静态引用使我们可以象调用本地方法一样调用一个引入的方法,当我们需要引入同一个类的多个方法时,只需写为“import static java.lang.Math.*”即可。这样的引用方式对于枚举也同样有效。

6、Metadata(Annotations) (元数据):



↑返回目录
前一篇: [J2SE 5.0专题][2.8]C风格格式化输出
后一篇: [J2SE 5.0专题][2.4]类型安全的枚举