Java 5.0 New Features

最近又開始寫 Java 了, 大概四年沒碰過 Java 了吧,而且其實以前也沒用很熟,好像只用到 Java 2 的功能,現在接觸 Android SDK,其實看到蠻多 Java5 才有的新功能。

官方宣佈: http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html

中文摘要: http://mi.hosp.ncku.edu.tw/km/index.php/javatech/43-javaother/46-java-50-

最近有遇到的是

  • Enumerated
  • for/in
  • Annotation
  • Static Import

Generic 是沒用到, 不過倒是遇到使用舊語法導致的編譯器警告

Enumerated型別

 同C++中Enum。在Java 1.4以前都用public static final屬性代替Enum功能,這兩種方法各有優缺點。Enum重點如下︰

  • Enum是class
  • Enum繼承了java.lang.Enum
  • Enumerated型別不是integer
  • Enum沒有public constructor
  • Enum值為public static final
  • Enum可用==及equals作比較
  • Enum實作了java.lang.Comparable
  • Enum改寫過toString()
  • Enum提供valueOf()
  • Enum定義了final ordinal()
  • Enum定義了values()

可是似乎不太好用,因為預設「Enumerated型別不是integer」,用起來沒辦法像 C/C++ 自由跟普通變數作轉換,也有人認為 Java5 的 Enum 設計成這樣是多此一舉,因為它骨子裡還是用 class 去作,而且 Android SDK 似乎本身也沒用 Enum,不知道有什麼考量嗎?

以我遇到的狀況來說,原本的程式有定義一組參數,有幾種不同的選項,所以是定義一大堆 final variable, 例如:

private static final int XXX_OPTION_OO = 0;
private static final int XXX_OPTION_OX = 1;
private static final int XXX_OPTION_XO = 2;
private static final int XXX_OPTION_XX = 3;

真正選到的參數會以 interger 的形式帶進來(可能是讀檔,或從config讀進來,未必是傳參數的方式)和以上幾個作比較,使得我要使用 Enum 時還要再自己寫一個轉換函式,網路上也很多人用 constructor 的方式加上一個 _id 來作轉換,不過這作法似乎蠻醜的,我還沒決定要這樣用。

for/in

原本的 iterator 可以改成 for( item : items ) 的方式

Annotation

  • Override
  • Deprecated
  • SupressWarnings
  • Marker annotation
  • Single-Value annotation
  • Full annotation

這個倒是不錯,一方面提供 document 的資訊,一方面也能避免使用繼承時打錯字造成的 bug 之類的問題。

靜態匯入(Static Import)

可以直接 import 其他 package 的變數或常數定義,其實可以配合前面提到的 Enum/常數時使用。

Comments are closed.