J2SE 5.0 (Tiger)的發布是Java語言發展史上的一個重要的裡程碑, 是迄今為止在 Java 編程方面所取得的最大進步。
J2SE 5.0提供了很多令人激動的特性。這些特性包括范型(generics)的支持, 枚舉類型(enumeration)的支持, 元數據(metadata)的支持, 自動拆箱(unboxing)/裝箱(autoboxing), 可變個數參數(varargs), 靜態導入(static imports), 以及新的線程架構(Thread framework)。
隨著J2SE 5.0的推出, 越來越多的集成開發環境(IDE)支持J2SE 5.0的開發。 聞名的開源Java IDE Eclipse從3.1M4開始支持J2SE 5.0的開發, 目前最新的版本是3.1RC4。
本系列將介紹J2SE 5.0中三個比較重要的特性: 枚舉類型, 注釋類型, 范型, 並在此基礎上介紹在如何在Eclipse 3.1開發環境中開發枚舉類型, 注釋類型和范型應用。本文將介紹注釋類型。
注釋類型
1、注釋類型簡介
J2SE 5.0提供了很多新的特性。其中的一個很重要的特性,就是對元數據(Metadata)的支持。在J2SE5.0中,這種元數據叫作注釋(Annotation)。通過使用注釋, 程序開發人員可以在不改變原有邏輯的情況下,在源文件嵌入一些補充的信息。代碼分析工具,開發工具和部署工具可以通過這些補充信息進行驗證或者進行部署。舉個例子,比如說你希望某個方法的參數或者返回值不為空,雖然我們可以在Java doc中說明,但是表達同樣意思的說法有很多,比如"The return value should not be null"或者"null is not allowed here"。測試工具很難根據這些語言來分析出程序員所期望的前提條件(Pre-condition)和執行後的條件(Post-condition)。 而使用注釋(Annotation),這個問題就可以輕而易舉的解決了。
2、定義注釋
J2SE5.0支持用戶自己定義注釋。定義注釋很簡單,注釋是由@Interface要害字來聲明的。比如下面是一個最簡單的注釋(Annotation)。
清單1一個最簡單的注釋
public @interface TODO{}
除了定義清單1中的注釋以外,我們還可以在注釋(Annotation)中加入域定義。方法很簡單,不需定義Getter和Setter方法,而只需一個簡單的方法,比如:
清單2 為注釋加入域
public @interface TODO{
String priority();
}
定義了這個注釋之後,我們在程序中引用就可以使用這個注釋了。
清單3 使用自定義的注釋
@TODO(
priority="high"
)
public void calculate(){
//body omission
}
由於TODO中只定義了一個域,使用TODO的時候,可以簡寫為
清單4 單域注釋的簡寫
@TODO("high")
類似的,你可以在你的注釋(Annotation)類型中定義多個域,也可以為每個域定義缺省值。比如:
清單5定義缺省值
public @interface TODO{
String priority();
String owner();
boolean testable() default true;
}
假如定義了缺省值,在使用的時候可以不用再賦值。比如:
清單6使用定義了缺省值的注釋
@TODO(priority="high",owner="Catherine" )
public void calculate(){
//body omission
}
在這個例子中,testable用缺省值true。
和上文一樣,我們使用Eclipse 3.1作為集成的編譯運行環境。Eclipse 3.1提供了向導幫助用戶來定義注釋。 1.首先我們創建一個Plug-in 項目,com.catherine.lab.annotation.demo。在Package EXPlorer中選中包package com.catherine.lab.annotation.demo, 2.點擊New->Other->Java->Annotation,彈出了下面的對話框。4.輸入注釋的名稱,在這裡例子中輸入TODO, 點擊Finish, 圖2中的注釋就生成了。
圖1 創建注釋向導
圖2 注釋向導生成的代碼
1) 注釋的類型
從上面的例子中,我們可以看出,按照使用者所需要傳入的參數數目, 注釋(Annotation)的類型可以分為三種。
第一種是標記注釋類型:
標記注釋(Marker)是最簡單的注釋, 不需要定義任何域。下面要介紹的Override和Deprecated都是標記類型的。當然,假如一個注釋類型提供了所有域的缺省值,那麼這個注釋類型也可以認為是一個注釋類型。使用標記類型的語法很簡單。
清單7 標記注釋的用法
@MarkerAnnotation
第二種是單值注釋類型:單值注釋類型只有一個域。語法也很簡單:
清單8 單值注釋的用法
@SingleValueAnnotation("some value")
第三種是全值注釋類型。 全注釋類型其實並不算是一個真正的類型,只是使用注釋類型完整的語法:
清單9 全值注釋的用法
@MultipleValueAnnotation(