Пакеты в Java 8

Цикл статей «Учебник Java 8».

Следующая статья — «Классы и объекты в Java 8».
Предыдущая статья — «Java 8 операторы управления порядком выполнения».

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

Чтобы указать пакет, к которому относится класс нужно использовать ключевое слово package  в самом верху файла с классом. Пример:

Большинство реализаций Java рассчитывают на иерархическую файловую систему при организации файлов исходников и файлов .class , хотя спецификация Java НЕ требует этого.

Чтобы успешно запустить скомпилированный Main.class  из примера выше нужно создать структуру каталогов, повторяющую структуру пакета:

Запускать нужно из каталога, в котором находится каталог «ru» (в случае Linux нужно использовать знак «/» вместо «\»):

Обратите внимание на используемое имя пакета: «ru.urvanov.javaexamples.packageexamples». Согласно соглашению о кодировании имена пакетам даются в соответствии с правилами:

  • Пакеты записываются строчными буквами, чтобы избежать конфликтов с именами классов и интерфейсов.
  • Используется обратная запись домена организации, например для urvanov.ru получится ru.urvanov.
  • После обратной записи домена добавляется имя пакета или имя проекта с именем пакета внутри проекта. В примере выше имя проекта javaexamples, а имя пакета внутри проекта packageexamples.
  • Чтобы избежать конфликтов имён внутри организации можно добавлять между именем домена и именем проекта имя региона или отдела. Например: ru.urvanov.moscow.javaexamples.packageexamples.
  • Пакеты внутри Java начинаются с java  или javax.
  • Дефис в имени домена заменяется на символ подчёркивания.
  • Если имя домена содержит ключевое слово, то к имени пакета добавляется подчёркивание в конце.
  • Если имя домена начинается с цифры, то добавляется подчёркивание в начало имени пакета.

Примеры:

Имя домена Префикс имени пакета
hyphenated-name.example.org org.example.hyphenated_name
example.int int_.example
123name.example.com com.example._123name

Если же пакет не указывать, как это было сделано в «Введение в Java 8», то используется пакет по умолчанию. Пакет по умолчанию можно использовать только для очень простых проектов.

Обратиться к членам пакета внутри самого пакета можно по имени самого члена, имя пакета указывать не обязательно:

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

Создать экземпляр класса Main  из другого пакета можно так:

Если пакет используется часто, то постоянное написание полного имени пакета усложнит понимание кода. В таких случаях можно использовать операторы import , которые добавляются между package  и объявлениями классов:

С помощью оператора import  можно также импортировать всё содержимое пакета с помощью символа «*», а не только один класс:

С помощью звёздочки можно импортировать только всё содержимое пакета, но нельзя импортировать лишь какую-то его часть.

По умолчанию в Java в каждый файл уже импортированы два пакета: java.lang  и пакет текущего файла.

Не смотря на то что пакеты кажутся иерархическими, они такими не являются. Пакет ru.urvanov.javaexamples  не включает в себя пакет ru.urvanov.javaexamples.packageexamples. Это два совершенно разных пакета.

Строка

Импортирует только члены пакета ru.urvanov.javaexamples , но не члены пакета ru.urvanov.javaexamples.packageexamples.

Если два пакета содержат член (класс, интерфейс или перечисления) с одинаковым именем, и оба этих пакета импортированы, то для доступа к этим членам нужно использовать полное имя с указанием пакета:

Если вы часто используете константы из какого-либо класса, то постоянное указание имени класса делает код более запутанным. В таких случаях можно использовать оператор import static. Класс java.lang.Math, например, содержит константу PI. Для более простого доступа к ней можно импортировать эту константу:

Слова import  и static  менять местами нельзя! Нельзя писать static import, только import static!

Теперь можно обращаться к PI  только по имени:

Можно импортировать все константы из класса с помощью звёздочки:

Не стоит лишний раз использовать import  со звёздочкой и import static. Лучше включать в файл только нужное. Современные IDE позволяют буквальное парой кнопок организовать операторы import  в файле.

 

Причины использования пакетов:

  • Можно легко понять, что эти типы в одном пакете связаны между собой.
  • Легче искать классы с определённым функционалом, так как они находятся в одном пакете.
  • Имена типов не будут конфликтовать с именами типов, созданными другими разработчиками.
  • Можно дать классам внутри пакета полный доступ к членам друг друга, но при этом запретить доступ к некоторым из них снаружи (будет объяснено в главе про классы).

Цикл статей «Учебник Java 8».

Следующая статья — «Классы и объекты в Java 8».
Предыдущая статья — «Java 8 операторы управления порядком выполнения».

Один комментарий к “Пакеты в Java 8”

  1. А были ли, собственно, в рамках данного учебника рассмотрены классы? Может рано про пакеты-то?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *