天天看點

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) (中繼資料):

繼續閱讀