包私有访问级别比protected:更具约束性:仅通过子类化类仍然可以访问受保护的属性和方法。受保护的成员是(或可能是)旨在继承的,而包私有的成员则不是。
通常使用程序包专用成员,因此程序包中的多类可以访问特定于实现的属性或(实用程序)方法。
很好的例子是的package-private构造函数String和StringBuilder.valuechar数组:
String(char[] value, boolean share) {
this.value = value;
}
因此,如果内容已经存在,则java.lang包中的类可以有效地创建新Strings内容,char[]而不会影响安全性。您无法在应用程序中执行此操作,因为如果可以,您将可以访问(引用)String不可变的内部char数组(不计算反射!)。
在StringBuilder(或者说AbstractStringBuilder,其中的执行来自)char数组保持的电流值char[] value和存取方法本char[] getValue()也包私人的,从而各种实用方法String等contentEquals(StringBuffer sb)并contentEquals(CharSequence cs)可以利用该对效率和更快的比较而无需内部char数组暴露于世界”。
protected修饰符与package private子类相同,只是子类也被邀请参加聚会。但是,如果不自然地创建子类关系(仅出于访问目的),那将是错误的。通常EmailSender,将某个类作为DomainObjectFilter类的子类通常是没有任何意义的,反之亦然。在这种情况下,通常只使用该方法public(也许在注释中说它在概念上不是公开的...)。