Когда я буду использовать пакетную приватность в Java?

Мне нравится контроль доступа на любом языке, но я нахожу, что в Java я почти никогда (если вообще когда-либо) не использую модификатор доступа с закрытым пакетом (или его отсутствие).

Я понимаю, что внутренние классы могут быть private, protected, или же package-private, но внешние классы могут быть только package-private или же public, Почему внешний класс может быть package-private но нет protected? Какая польза от ограничения классов / методов / полей, видимых всем пакетом, но не подклассами?

2 ответа

Решение

Я использую package-private классы и методы, когда я хочу скрыть детали реализации от пользователей (и других классов) вне пакета.

Например, если у меня есть интерфейс и фабричный класс, который создает экземпляры этого интерфейса, я могу иметь класс реализации в виде отдельного файла, но пометить его как приватный пакет, чтобы другие не могли его использовать, и он не загромождает JavaDoc (если javadoc установить только показывать публике).

Если вы запечатаете свой jar-файл, то методы с закрытым пакетом также могут помочь ограничить доступ к этим методам. Если метод является общедоступным или защищенным, подклассы могут по-прежнему видеть и вызывать этот метод, даже если он находится в другом пакете. (Нераспечатанные файлы jar позволяют любому создавать классы в ваших пакетах, чтобы они могли получить доступ к закрытым или защищенным методам пакета)

Во многих случаях одноранговые классы в одном и том же пакете имеют одного и того же автора, поэтому он знает о внутреннем способе работы этих классов или, другими словами, он знает о инкапсулированной логике этих классов. Таким образом, он может удостовериться, что частные доступы к пакетам между классами придерживаются инкапсулированной логики класса доступа, и что эти доступы ничего не нарушают.

Эти прямые обращения часто полезны для оптимизации и для уменьшения объема исходного кода.

На вопрос, почему внешние классы могут быть частными, но не защищенными, у меня нет ответа.

Другие вопросы по тегам