作者 Cedric Beust (TestNG 作者、WebLogic 核心開發) 參與 JSR 175/201 制定,分享半年 JDK 5 實戰經驗。本文針對六大核心特性給出一線開發視角的優劣評價。
for (String name : names) { ... }String[] 改為 List<String> 僅需修改宣告行,迴圈體完全不用動。⭐⭐⭐⭐⭐ 日常開發首選,極大提升可讀性與維護性。
長期以來,Java 缺乏標準元資料機制,開發者靠命名慣例、XDoclet、屬性檔、介面標記等「駭客手段」攜帶元資料。Annotations 提供標準化、型別安全、運行時可反射的元資料載體。
@Override、@Deprecated、@SuppressWarnings)。@Override 等內建註解是否必要?作者持保留態度,但承認未來幾年絕大多數 Java 程式碼將包含註解。
⭐⭐⭐⭐⭐ 生態系統變革者,現代 Java 框架基石。
防止「實作介面只為繼承常數」反模式,允許直接使用 Math.PI、Color.RED 等靜態成員。
⭐⭐ 語法糖,非必要,團隊需制定編碼規範限制使用範圍。
public void printf(String format, Object... args) { ... }
⭐⭐⭐ 語法糖,適度使用無妨,勿濫用。
既有代碼庫大量使用 public static final int 常數,遷移成本高、風險大,且 IDE 重構支援有限。
⭐⭐⭐⭐ 新專案強烈建議使用,舊代碼按需遷移。
ClassCastException 風險。List<String> 比 List 表達力強得多。// 宣告與實例化雙重指定型別參數
Map<String, List<Account>> accounts = new HashMap<String, List<Account>>();
new HashMap<>() 為 JDK 7 才引入,JDK 5 必須重複寫兩次。List<Account> → Collection<Account>) 需全域搜尋替換。class AccountMap extends HashMap<String, List<Account>> {} (但繼承實作類而非介面)。new T()、T.class、instanceof List<String>)。⭐⭐⭐⭐ 大勢所趨,長期收益遠大於短期適應成本,配合 IDE 輔助可控制複雜度。
Integer i = 10; // 自動裝箱 Integer.valueOf(10)
int j = i; // 自動拆箱 i.intValue()
i += 1; // 拆箱 → 運算 → 裝箱,產生新 Integer 物件
Integer 快取範圍 -128~127,超出範圍 == 比較失效。Integer i = null; int j = i; 拋出 NPE。暫不使用,建議 IDE 標記裝箱/拆箱位置,團隊制定規範 (如禁止在熱點路徑使用)。
⭐⭐⭐ 語法糖,明確理解行為後可用於非效能敏感路徑。
| 特性 | 推薦指數 | 核心建議 |
|---|---|---|
| Enhanced For | ⭐⭐⭐⭐⭐ | 全面採用,重構利器 |
| Annotations | ⭐⭐⭐⭐⭐ | 擁抱宣告式編程,框架開發必備 |
| Generics | ⭐⭐⭐⭐ | 新專案強制啟用,善用 IDE 重構控制複雜度 |
| Enum | ⭐⭐⭐⭐ | 新代碼優先使用,單例最佳實踐 |
| Autoboxing | ⭐⭐⭐ | 認清效能代價,避開熱點路徑 |
| Varargs | ⭐⭐⭐ | 工具方法/測試代碼適度使用 |
| Static Import | ⭐⭐ | 團隊規範限制使用,避免降低可讀性 |
JDK 5 並非完美,但以向後相容方式推進了 Java 型別系統與元資料能力的根本性飛躍。隨著開發者逐漸掌握最實用的子集,Java 邁向更健壯、更具表達力的新紀元。
Cedric Beust,WebLogic Server 高級工程師,TestNG 作者,JSR 175 (Annotations) / JSR 201 (Generics) 專家組成員。部落格:Otaku。