1. 程式人生 > >使用Java package-info類為包服務

使用Java package-info類為包服務

Java 中有一個特殊的類:package-info 類,它是專門為本包服務的,為什麼說它特殊呢?主要體現在3 個方面:
  • 它不能隨便被建立
    在一般的IDE 中,Eclipse、package-info 等檔案是不能隨便被建立的,會報“Type name is notvalid”錯誤,類名無效。在Java 變數定義規範中規定如下字元是允許的:字母、數字、下劃線,以及那個不怎麼常用的$ 符號,不過中劃線可不在之列,那怎麼建立這個檔案呢?很簡單,用記事本建立一個,然後拷貝進去再改一下就成了,更直接的辦法就是從別的專案中拷貝過來。
  • 它服務的物件很特殊
    一個類是一類或一組事物的描述,比如Dog 這個類,就是描述“旺財”的,那package-info這個類是描述什麼的呢?它總要有一個被描述或被陳述的物件吧,它是描述和記錄本包資訊的。
  • package-info 類不能有實現程式碼
    package-info 類再怎麼特殊也是一個類, 也會被編譯成package-info.class, 但是在package-info.java 檔案裡不能宣告package-info 類。

package-info 類還有幾個特殊的地方,比如不可以繼承,沒有介面,沒有類間關係(關聯、組合、聚合等)等,不再贅述,Java 中既然允許存在這麼一個特殊的類,那肯定有其特殊的作用了,我們來看看它的作用,主要表現在以下三個方面:
  • 宣告友好類和包內訪問常量
    這個比較簡單,而且很實用,比如一個包中有很多內部訪問的類或常量,就可以統一放到package-info 類中,這樣很方便,而且便於集中管理,可以減少友好類到處遊走的情況,程式碼如下:
    // 這裡是包類,宣告一個包使用的公共類
    class PkgClass{
        public void test(){ }
    }
    // 包常量,只允許包內訪問
    class PkgConst{
        static final String PACAKGE_CONST="ABC";
    }
    注意以上程式碼是存放在package-info.java 中的,雖然它沒有編寫package-info 的實現,但是package-info.class 類檔案還是會生成。通過這樣的定義,我們把一個包需要的類和常量都放置在本包下,在語義上和習慣上都能讓程式設計師更適應。
  • 為在包上標註註解提供便利
    比如我們要寫一個註解(Annotation),檢視一個包下的所有物件,只要把註解標註到package-info 檔案中即可, 而且在很多開源專案也採用了此方法, 比如Struts2 的@namespace、Hibernate 的@FilterDef 等。
  • 提供包的整體註釋說明
    如果是分包開發,也就是說一個包實現了一個業務邏輯或功能點或模組或元件,則該包需要有一個很好的說明文件,說明這個包是做什麼用的,版本變遷歷史,與其他包的邏輯關係等,package-info 檔案的作用在此就發揮出來了,這些都可以直接定義到此檔案中,通過javadoc 生成文件時,會把這些說明作為包文件的首頁,讓讀者更容易對該包有一個整體的認識。當然在這點上它與package.htm 的作用是相同的,不過package-info 可以在程式碼中維護文件的完整性,並且可以實現程式碼與文件的同步更新。

    解釋了這麼多,總結成一句話:在需要用到包的地方,就可以考慮一下package-info 這個特殊類,也許能起到事半功倍的作用。