Когда я буду использовать package-private в Java?

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

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

2 ответа

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

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

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


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

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

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

licensed under cc by-sa 3.0 with attribution.