建議50: 使用package-info類為包服務
Java中有一個特殊的類:package-info類,它是專門為本包服務的,為什麼說它特殊呢?主要展現在3個方面:
(1)它不能随便被建立
在一般的IDE中,Eclipse、package-info等檔案是不能随便被建立的,會報“Type name is notvalid”錯誤,類名無效。在Java變量定義規範中規定如下字元是允許的:字母、數字、下劃線,以及那個不怎麼常用的$符号,不過中劃線可不在之列,那怎麼建立這個檔案呢?很簡單,用記事本建立一個,然後拷貝進去再改一下就成了,更直接的辦法就是從别的項目中拷貝過來。
(2)它服務的對象很特殊
一個類是一類或一組事物的描述,比如Dog這個類,就是描述“旺财”的,那package-info這個類是描述什麼的呢?它總要有一個被描述或被陳述的對象吧,它是描述和記錄本包資訊的。
(3)package-info類不能有實作代碼
package-info類再怎麼特殊也是一個類,也會被編譯成package-info.class,但是在package-info.java檔案裡不能聲明package-info類。
package-info類還有幾個特殊的地方,比如不可以繼承,沒有接口,沒有類間關系(關聯、組合、聚合等)等,不再贅述,Java中既然允許存在這麼一個特殊的類,那肯定有其特殊的作用了,我們來看看它的作用,主要表現在以下三個方面:
(1)聲明友好類和包内通路常量
這個比較簡單,而且很實用,比如一個包中有很多内部通路的類或常量,就可以統一放到package-info類中,這樣很友善,而且便于集中管理,可以減少友好類到處遊走的情況,代碼如下:
1 //這裡是包類,聲明一個包使用的公共類
2 class PkgClass{
3 public void test(){ }
4 }
5 //包常量,隻允許包内通路
6 class PkgConst{
7 static final String PACAKGE_CONST="ABC";
8 }
注意以上代碼是存放在package-info.java中的,雖然它沒有編寫package-info的實作,但是package-info.class類檔案還是會生成。通過這樣的定義,我們把一個包需要的類和常量都放置在本包下,在語義上和習慣上都能讓程式員更适應。
(2)為在包上标注注解提供便利
比如我們要寫一個注解(Annotation),檢視一個包下的所有對象,隻要把注解标注到package-info檔案中即可,而且在很多開源項目也采用了此方法,比如Struts2的@namespace、Hibernate的@FilterDef等。
(3)提供包的整體注釋說明
如果是分包開發,也就是說一個包實作了一個業務邏輯或功能點或子產品或元件,則該包需要有一個很好的說明文檔,說明這個包是做什麼用的,版本變遷曆史,與其他包的邏輯關系等,package-info檔案的作用在此就發揮出來了,這些都可以直接定義到此檔案中,通過javadoc生成文檔時,會把這些說明作為封包檔的首頁,讓讀者更容易對該包有一個整體的認識。當然在這點上它與package.htm的作用是相同的,不過package-info可以在代碼中維護文檔的完整性,并且可以實作代碼與文檔的同步更新。
解釋了這麼多,總結成一句話:在需要用到包的地方,就可以考慮一下package-info這個特殊類,也許能起到事半功倍的作用。
作者:SummerChill 出處:http://www.cnblogs.com/DreamDrive/ 本部落格為自己總結亦或在網上發現的技術博文的轉載。 如果文中有什麼錯誤,歡迎指出。以免更多的人被誤導。 |