The package-private access level is more restrictive than protected
: protected attributes and methods can still be accessed by simply subclassing a class. Protected members are (or may be) intended for inheritance while package-private members are not.
Package-private members are often used so multilpe classes inside a package can access implementation-specific attributes or (utility) methods.
Good examples to this are the package-private constructor of String
and the StringBuilder.value
char array:
/*
* 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;
}
So classes inside the java.lang
package can efficiently create new Strings
if the content is already present in a char[]
without compromising security. You cannot do this from your application because if you could, you would have access (reference) to the internal char array of a String
which is immutable (reflection not counted!).
In StringBuilder
(or rather AbstractStringBuilder
where the implementation comes from) the char array holding the current value char[] value
and an accessor method to this char[] getValue()
are also package-private so various utility methods of String
like contentEquals(StringBuffer sb)
and contentEquals(CharSequence cs)
can utilize this for efficiency and faster comparisons without exposing the internal char array to the "world".
protected
modifier is the same aspackage private
except that subclasses are also invited to the party. But it would be wrong to create a subclass relationship (just for access purposes) if one didn't naturally exist. It wouldn't generally make any sense for e.g. anEmailSender
class to be a subclass of anDomainObjectFilter
class or vice versa. In this situation the method is generally just madepublic
(perhaps with a comment saying that it's not conceptually public...). – Glynas