Уровень доступа для пакетов более строгий, чем protected
: к защищенным атрибутам и методам по-прежнему можно получить доступ, просто создав подкласс класса. Члены Protected предназначены (или могут быть) для наследования, а члены package-private — нет.
Частные члены пакета часто используются, поэтому несколько классов внутри пакета могут получить доступ к зависимым от реализации атрибутам или (служебным) методам.
Хорошими примерами этого являются закрытый для пакета конструктор 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
, который является неизменным (отражение не учитывается!).
В StringBuilder
(или, скорее, AbstractStringBuilder
, откуда берется реализация) массив символов, содержащий текущее значение char[] value
, и метод доступа к этому char[] getValue()
также являются частными для пакета, поэтому различные служебные методы String
, такие как contentEquals(StringBuffer sb)
и contentEquals(CharSequence cs)
, могут использовать это для повышения эффективности и более быстрого сравнения. без раскрытия внутреннего массива символов «миру».
person
icza
schedule
10.02.2015