J2SE 5.0 (Tiger) 的發布是 Java 語言發展史上的一個重要里程碑,是迄今為止在 Java 程式設計方面所取得的最大進步。J2SE 5.0 提供了很多令人激動的特性,包括泛型、枚舉類型、元資料、自動拆箱/裝箱、可變參數、靜態導入,以及新的執行緒架構。
隨著 J2SE 5.0 的推出,越來越多的整合開發環境 (IDE) 支援 J2SE 5.0 的開發。聞名的開源 Java IDE Eclipse 從 3.1M4 開始支援 J2SE 5.0 的開發,目前最新的版本是 3.1RC4。
本系列將介紹 J2SE 5.0 中三個比較重要的特性:枚舉類型、註解類型、泛型,並在此基礎上介紹在 Eclipse 3.1 開發環境中開發這些應用。本文將介紹註解類型。
J2SE 5.0 提供了很多新的特性。其中一個很重要的特性,就是對元資料的支援。在 J2SE 5.0 中,這種元資料叫作註解。透過使用註解,程式開發人員可以在不改變原有邏輯的情況下,在原始檔嵌入一些補充的資訊。程式碼分析工具、開發工具和部署工具可以透過這些補充資訊進行驗證或者進行部署。舉個例子,比如說你希望某個方法的參數或者返回值不為空,雖然我們可以在 JavaDoc 中說明,但是表達同樣意思的說法有很多,比如 "The return value should not be null" 或者 "null is not allowed here"。測試工具很難根據這些語言來分析出程式設計師所期望的前置條件和執行後的條件。而使用註解,這個問題就可以輕而易舉地解決了。
J2SE 5.0 支援使用者自己定義註解。定義註解很簡單,註解是由 @interface 關鍵字來宣告的。比如下面是一個最簡單的註解:
public @interface TODO {}
除了定義清單 1 中的註解以外,我們還可以在註解中加入欄位定義。方法很簡單,不需定義 Getter 和 Setter 方法,而只需一個簡單的方法,比如:
public @interface TODO {
String priority();
}
定義了這個註解之後,我們在程式中引用就可以使用這個註解了。
@TODO(
priority="high"
)
public void calculate() {
// body omission
}
由於 TODO 中只定義了一個欄位,使用 TODO 的時候,可以簡寫為:
@TODO("high")
類似的,你可以在你的註解類型中定義多個欄位,也可以為每個欄位定義預設值。比如:
public @interface TODO {
String priority();
String owner();
boolean testable() default true;
}
如果定義了預設值,在使用的時候可以不用再賦值。比如:
@TODO(priority="high", owner="Catherine")
public void calculate() {
// body omission
}
在這個例子中,testable 使用預設值 true。
我們使用 Eclipse 3.1 作為整合的編譯執行環境。Eclipse 3.1 提供了嚮導幫助使用者來定義註解。首先我們創建一個 Plug-in 專案,com.catherine.lab.annotation.demo。在 Package Explorer 中選中套件 package com.catherine.lab.annotation.demo,點擊 New → Other → Java → Annotation,彈出對話框。輸入註解的名稱,在這裡例子中輸入 TODO,點擊 Finish,註解就生成了。
從上面的例子中,我們可以看出,按照使用者所需要傳入的參數數目,註解的類型可以分為三種。
標記註解是最簡單的註解,不需要定義任何欄位。下面要介紹的 @Override 和 @Deprecated 都是標記類型的。當然,如果一個註解類型提供了所有欄位的預設值,那麼這個註解類型也可以認為是一個標記類型。使用標記類型的語法很簡單:
@MarkerAnnotation
單值註解類型只有一個欄位。語法也很簡單:
@SingleValueAnnotation("some value")
完整註解類型其實並不算是一個真正的類型,只是使用註解類型完整的語法:
@MultipleValueAnnotation(
// 多個欄位賦值
)