2009-07-06 28 views
34

我是一個新手,剛學到了,如果我定義說在Java文件中定義一個包的目的是什麼?

package my.first.group.here; 
... 

那麼Java文件,這些文件在此方案將my/first/group/here目錄下放置。

將某些Java文件放入包中的主要目的是什麼?另外,如果我選擇採用這種方式,我應該如何對它們進行分組?

謝謝


編輯:任何人誰可能再有同樣的問題,我只是發現this tutorial on packages從Sun

回答

32

讓我們從一個「Java包」的定義開始,如Wikipedia article描述:

Java包是 機制組織Java類到 命名空間類似於 MODULA的模塊。 Java包可以存儲在 被稱爲JAR文件的壓縮文件中, 允許類以更快的速度下載,而不是一次一個。程序員通常還使用 程序包來將屬於 的類組織到同一類別或提供類似的功能 。

所以此基礎上,包在Java中只是用來組織類和防止類名稱衝突的機制。你能說出他們任何你想要的,但Sun公司已經公佈了一些naming conventions應該使用時包命名:

一個獨特的包名的前綴 總是寫在所有-lowercase ASCII 字母應該是 頂級域名之一,目前COM, EDU,GOV,MIL,淨,組織,或識別 國家的specifi的 英語雙字母代碼之一編輯在ISO標準 3166,1981年

包 名的後續部分根據不同的 機構自身的內部命名 約定。這樣的約定可能會在 中指定某個目錄名稱爲 的組件是部門,部門, 項目,機器或登錄名。

實例:

  • com.sun.eng

  • com.apple.quicktime.v2

  • edu.cmu.cs.bovik.cheese

0

Wikipedia頁的題目

「Java包是組織Java類成類似MODULA的模塊命名空間的機制Java包可以存儲在壓縮文件名爲JAR文件,允許類。作爲一個組而不是一個一個地下載更快,程序員通常使用包來組織同屬於同一類別的類或提供類似的功能。「

4

它允許程序由多個不同的程序/組件/庫組成,因此它們的類名不會發生衝突,並且組件更容易組織。請參閱http://java.sun.com/docs/books/tutorial/java/package/index.html

在Java中,習慣上將包命名爲反向域名。例如,如果您公司的域名是「initech.com」,並且您正在製作一個名爲「Gizmo」的程序,則程序包名稱通常以「com.initech.gizmo」爲前綴,其中包含程序不同組件的子包。

2

包提供類分離的靈活性非常重要。它們可用於:

  • 分離項目
  • 分離模塊
  • 分離應用層(業務,網絡,DAO)
  • 進一步更細粒度碼分離

例如

com.mycompany.thisproject.thismodule.web

可以指示某個模塊的Web層。

10

我是一個大型的應用程序,你一定會有兩個文件命名完全相同(java.util.Date和java.sql.Date),特別是當你開始引入第三方jar時。所以基本上,你可以使用包來確保唯一性。

最重要的是,在我看來,包裝將項目分解成有意義的細分市場。所以我的SQL包具有與sql相關的代碼,並且我的記錄器包處理日誌記錄。

+1

「......你可以使用軟件包來確保唯一性......」完全正確。高效術語是「劃分全局命名空間」。您引用了java.util.Date和java.sql.Date。 – duffymo 2009-07-06 19:45:23

0

另外,如果我選擇採用這種方式,我應該如何對它們進行分組?

這很大程度上取決於您在項目中使用的設計模式。大多數情況下(特別是,如果你很新的話),你會希望按功能或其他邏輯相似性對它們進行分組。

+0

此外,我還要補充說,「選擇採用」並不是真正的選擇,「必須採用」更符合現實。一般而言,在「默認」包中留下課程是令人不悅的。 – cjstehno 2009-08-31 19:58:59

0

Java在其實現中非常確切。它並沒有真正留下冒險的餘地。

如果每個人都使用相同的軟件包,他們將不得不尋找一些「全球範圍」的方式來確保沒有兩個類名衝突。

這可以讓每一個班級都寫入自己的「地方」,如果你不想看,你就不必看。

您可能在系統的4個不同位置定義了不同的「Point」對象,但是您的課程只會使用您期望的(因爲您導入該課程)。

他們確保每個人都有自己的空間的方式是使用你的反向域,所以我的是「tv.kress.bill」。我擁有該域名 - 實際上我與我的兄弟「tv.kress.doug」分享,儘管我們共享相同的域名,但我們不能碰撞。

如果貴公司的一百個部門都是用Java開發的,那麼他們可以在不碰撞的情況下知道如何劃分它。

不做這種劃分的系統現在對我來說看起來很片斷。我可能會用它們來拼湊一些個人的腳本,但如果沒有嚴格的包裝,我會覺得不舒服。

0

其他人已經提供了非常特定於Java的答案,這很好,但這裏有一個比喻:爲什麼要將文件組織到硬盤上的目錄中?爲什麼不只是在一個目錄中有一個平面文件系統?

答案當然是包提供組織。與數據庫接口的程序部分與向用戶顯示UI的程序部分不同,因此它們將位於不同的包中。

與目錄類似,它也提供瞭解決名稱衝突的方法。你可以在兩個不同的目錄中有一個temp.txt,就像你可以有兩個類出現在不同的包中一樣。這變得很重要(1)當你開始將代碼與其他人在互聯網上結合起來時,或者(2)甚至意識到Java的類加載如何工作。

0

關於軟件包的另一個重要的事情是用於訪問控制的protected成員。

受保護位於公衆(每個人都可以訪問)和私人(只有班級內部可以訪問)之間。標記爲受保護的東西可以從相同的包或從子類中訪問。這意味着對於有限的訪問,您不必將所有內容放在同一個類中。

3

除了其他答案中提到的命名空間外,還可以根據該成員聲明的範圍限制對方法和字段的訪問。 成員與公共範圍都可以隨意訪問,限制訪問你通常將它們定義爲私人(即隱藏在類外)。 您也可以使用受保護的範圍來限制對類型及其子類的訪問。 也有默認範圍(沒有限定詞的構件具有默認的範圍),它允許子類型和類型中的構件相同的包的訪問。這可以成爲共享字段和方法的有效方式,而不會使其過於廣泛,並且可以幫助進行測試。

例如,下面的方法對同一包中的所有其他成員都是可見的。

public class Foo { 
    int doSomething() { 
     return 1; 
    } 
} 

要測試您可以定義在同一個包另一種類型的(但可能是一個不同的源位置)的方法,該類型將能夠訪問該方法。

public class FooTest { 
    @Test 
    int testDoSomething() { 
     Foo foo = new Foo(); 
     assertEquals(1, foo.doSomething()); 
    } 
} 
1

最終,我們想要在Java中使用軟件包有3個核心原因。

1)易於維護

組織classespackages如下的通過封裝原理關注點分離並允許在整個系統的設計更好的凝聚力。更進一步,按功能打包允許開發團隊找到相關的類和界面進行更改,支持敏捷方法中使用的縮放方法的垂直分片技術。欲瞭解更多信息,請參閱博文:Package your classes by Feature and not by LayersCoding: Packaging by vertical slice

2)提供包裝安全

軟件包允許外部訪問只是public訪問修飾符在包含類的方法。使用protected或不使用修飾符只能在同一個包中的類訪問。欲瞭解更多信息,請參見後: Which Java access modifier allows a member to be accessed only by the subclasses in other package?

3)避免類似命名

到.NET的命名空間類似,類名都包含其包含的包的範圍之內。這意味着兩個互斥的包可以包含具有相同名稱的類。這是因爲軟件包本身具有不同的名稱,因此完全限定名稱是不同的。有關更多信息,請參閱教程[命名軟件包:Java教程] [3]。

相關問題