Когда я буду использовать пакетную приватность в Java?
Мне нравится контроль доступа на любом языке, но я нахожу, что в Java я почти никогда (если вообще когда-либо) не использую модификатор доступа с закрытым пакетом (или его отсутствие).
Я понимаю, что внутренние классы могут быть private
, protected
, или же package-private
, но внешние классы могут быть только package-private
или же public
, Почему внешний класс может быть package-private
но нет protected
? Какая польза от ограничения классов / методов / полей, видимых всем пакетом, но не подклассами?
2 ответа
Я использую package-private
классы и методы, когда я хочу скрыть детали реализации от пользователей (и других классов) вне пакета.
Например, если у меня есть интерфейс и фабричный класс, который создает экземпляры этого интерфейса, я могу иметь класс реализации в виде отдельного файла, но пометить его как приватный пакет, чтобы другие не могли его использовать, и он не загромождает JavaDoc (если javadoc установить только показывать публике).
Если вы запечатаете свой jar-файл, то методы с закрытым пакетом также могут помочь ограничить доступ к этим методам. Если метод является общедоступным или защищенным, подклассы могут по-прежнему видеть и вызывать этот метод, даже если он находится в другом пакете. (Нераспечатанные файлы jar позволяют любому создавать классы в ваших пакетах, чтобы они могли получить доступ к закрытым или защищенным методам пакета)
Во многих случаях одноранговые классы в одном и том же пакете имеют одного и того же автора, поэтому он знает о внутреннем способе работы этих классов или, другими словами, он знает о инкапсулированной логике этих классов. Таким образом, он может удостовериться, что частные доступы к пакетам между классами придерживаются инкапсулированной логики класса доступа, и что эти доступы ничего не нарушают.
Эти прямые обращения часто полезны для оптимизации и для уменьшения объема исходного кода.
На вопрос, почему внешние классы могут быть частными, но не защищенными, у меня нет ответа.