讀古今文學網 > 編寫高質量代碼:改善Java程序的151個建議 > 建議50:使用package-info類為包服務 >

建議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類中,這樣很方便,而且便於集中管理,可以減少友好類到處遊走的情況,代碼如下:


//這裡是包類,聲明一個包使用的公共類

class PkgClass{

public void test(){}

}

//包常量,只允許包內訪問

class PkgConst{

static final String PACAKGE_CONST="ABC";

}


注意以上代碼是存放在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這個特殊類,也許能起到事半功倍的作用。