程序包專用訪問級別比protected
更受限制:受保護的屬性和方法仍然可以通過簡單繼承類來訪問。 受保護的成員是(或可能)用於繼承,而包私有成員則不是。
通常使用包私有成員,因此包內的多重類可以訪問實現特定的屬性或(實用程序)方法。
來就是很好的例子是String
的包私有的構造和StringBuilder.value
字符數組:
/*
* Package private constructor which shares value array for speed.
* this constructor is always expected to be called with share==true.
* a separate constructor is needed because we already have a public
* String(char[]) constructor that makes a copy of the given char[].
*/
String(char[] value, boolean share) {
// assert share : "unshared not supported";
this.value = value;
}
所以java.lang
包中的類可以高效地創建新Strings
如果內容已經存在於char[]
無危及安全。你不能在你的應用程序中這樣做,因爲如果可以的話,你可以訪問(引用)到String
的內部char數組,這是不可變的(反射不算!)。
在StringBuilder
(或更確切地說AbstractStringBuilder
其中執行來自)char數組保持的電流值char[] value
和存取方法本char[] getValue()
也包私人的String
所以各種實用程序的方法,如contentEquals(StringBuffer sb)
和contentEquals(CharSequence cs)
可以利用該對效率和快速比較,而不會將內部字符數組暴露給「世界」。
我可以看到爲什麼有人可能會這麼說 - 'protected'修飾符與'package private'相同,除了子類也被邀請參加聚會。但是如果不是自然存在的話,創建子類關係(僅用於訪問目的)會是錯誤的。它通常不會對例如一個EmailSender類是DomainObjectFilter類的一個子類,反之亦然。在這種情況下,這種方法通常只是「公開」(可能有一條評論說它不在概念上是公開的)。 –
「將給定模塊的所有類轉儲到完全相同的包中 - 不易操作」 - 正確,但我甚至在非平凡的情況下使用了這種方法,例如20-30個包裝類。當然,任何更大的東西都需要重構。 –
難道你不能將源文件組織到一個目錄層次結構中,然後在編譯之前將它們全部轉儲到同一個目錄/包中?那會給你組織結構和包私人訪問的好處,對嗎? – jrahhali