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/常數時使用。