1. Введение
В этом кратком руководстве мы рассмотрим основы пакетов в Java. Мы увидим, как создавать пакеты и получать доступ к типам, которые мы помещаем в них.
Мы также обсудим соглашения об именах и их связь с базовой структурой каталогов.
Наконец, мы скомпилируем и запустим наши упакованные классы Java.
2. Обзор пакетов Java
В Java мы используем пакеты для группировки связанных классов, интерфейсов и подпакетов .
Основными преимуществами этого являются:
- Облегчение поиска связанных типов — пакеты обычно содержат типы, которые логически связаны.
- Избегайте конфликтов имен — пакет поможет нам однозначно идентифицировать класс; например, у нас может быть
класс com.foreach.Application,
а также классыcom.example.Application.
- Управление доступом — мы можем контролировать видимость и доступ к типам, комбинируя пакеты и модификаторы доступа .
Далее давайте посмотрим, как мы можем создавать и использовать пакеты Java.
3. Создание пакета
Чтобы создать пакет, мы должны использовать оператор package
, добавив его в качестве самой первой строки кода в файле .
Давайте поместим тип в пакет с именем com.foreach.packages
:
package com.foreach.packages;
Настоятельно рекомендуется помещать каждый новый тип в упаковку. Если мы определим типы и не поместим их в пакет, они попадут в пакет по умолчанию
или безымянный пакет. Использование пакетов по умолчанию имеет несколько недостатков:
- Мы теряем преимущества пакетной структуры и не можем иметь подпакеты.
- Мы не можем импортировать типы в пакете по умолчанию из других пакетов.
- Области доступа
protected
иpackage-private
были бы бессмысленными .
Как указано в спецификации языка Java , безымянные пакеты предоставляются платформой Java SE главным образом для удобства при разработке небольших или временных приложений или при начале разработки.
Поэтому нам следует избегать использования безымянных пакетов или пакетов по умолчанию в реальных приложениях .
3.1. Соглашения об именах
Чтобы избежать пакетов с одинаковыми именами, мы следуем некоторым соглашениям об именах:
- мы определяем наши имена пакетов в нижнем регистре ****
- имена пакетов разделены точкой
- имена также определяются компанией или организацией, которые их создают
Чтобы определить имя пакета на основе организации, мы обычно начинаем с обращения URL-адреса компании. После этого соглашение об именовании определяется компанией и может включать названия подразделений и названия проектов.
Например, чтобы создать пакет из www.foreach.com
, давайте перевернем его:
com.foreach
Затем мы можем дополнительно определить его подпакеты, например com.foreach.packages
или com.foreach.packages.domain.
3.2. Структура каталогов
Пакеты в Java соответствуют структуре каталогов.
Каждый пакет и подпакет имеет свой собственный каталог. Итак, для пакета com.foreach.packages
у нас должна быть структура каталогов com -> foreach -> packages
.
Большинство IDE помогут создать эту структуру каталогов на основе имен наших пакетов, поэтому нам не нужно создавать их вручную.
4. Использование членов пакета
Начнем с определения класса TodoItem
в подпакете с именем domain
:
package com.foreach.packages.domain;
public class TodoItem {
private Long id;
private String description;
// standard getters and setters
}
4.1. Импорт
Чтобы использовать наш класс TodoItem
из класса в другом пакете, нам нужно его импортировать. После импорта мы можем получить к нему доступ по имени.
Мы можем импортировать один тип из пакета или использовать звездочку для импорта всех типов в пакете.
Давайте импортируем весь подпакет домена
:
import com.foreach.packages.domain.*;
Теперь давайте импортируем только класс TodoItem
:
import com.foreach.packages.domain.TodoItem;
JDK и другие библиотеки Java также поставляются со своими собственными пакетами. Таким же образом мы можем импортировать уже существующие классы, которые мы хотим использовать в нашем проекте.
Например, давайте импортируем базовый интерфейс Java List
и класс ArrayList :
import java.util.ArrayList;import java.util.List;
Затем мы можем использовать эти типы в нашем приложении, просто используя их имена:
public class TodoList {
private List<TodoItem> todoItems;
public void addTodoItem(TodoItem todoItem) {
if (todoItems == null) {
todoItems = new ArrayList<TodoItem>();
}
todoItems.add(todoItem);
}
}
Здесь мы использовали наши новые классы вместе с базовыми классами Java для создания списка
задач .
4.2. Полное имя
Иногда мы можем использовать два класса с одинаковыми именами из разных пакетов. Например, мы можем использовать как java.sql.Date
, так и java.util.Date
. Когда мы сталкиваемся с конфликтами имен, нам нужно использовать полное имя класса по крайней мере для одного из классов.
Давайте используем TodoItem
с полным именем:
public class TodoList {
private List<com.foreach.packages.domain.TodoItem> todoItems;
public void addTodoItem(com.foreach.packages.domain.TodoItem todoItem) {
if (todoItems == null) {
todoItems = new ArrayList<com.foreach.packages.domain.TodoItem>();
}todoItems.add(todoItem);
}
// standard getters and setters
}
5. Компиляция с помощью javac
Когда пришло время компилировать наши упакованные классы, нам нужно помнить нашу структуру каталогов. Начиная с исходной папки, нам нужно указать javac
, где найти наши файлы.
Сначала нам нужно скомпилировать наш класс TodoItem
, потому что наш класс TodoList
зависит от него.
Давайте начнем с открытия командной строки или терминала и перехода в наш исходный каталог.
Теперь давайте скомпилируем наш класс com.foreach.packages.domain.TodoItem
:
> javac com/foreach/packages/domain/TodoItem.java
Если наш класс компилируется корректно, мы не увидим сообщений об ошибках, а файл TodoItem.class
должен появиться в нашем каталоге com/foreach/packages/domain
.
Для типов, которые ссылаются на типы в других пакетах, мы должны использовать флаг -classpath
, чтобы сообщить команде javac
, где найти другие скомпилированные классы.
Теперь, когда наш класс TodoItem
скомпилирован, мы можем скомпилировать наши классы TodoList
и TodoApp
:
>javac -classpath . com/foreach/packages/*.java
Опять же, мы не должны видеть никаких сообщений об ошибках, и мы должны найти два файла классов в нашем каталоге com/foreach/packages
.
Давайте запустим наше приложение, используя полное имя нашего класса TodoApp
:
>java com.foreach.packages.TodoApp
Наш вывод должен выглядеть так:
6. Заключение
В этой короткой статье мы узнали, что такое пакеты и почему мы должны их использовать.
Мы обсудили соглашения об именах и то, как пакеты соотносятся со структурой каталогов. Мы также увидели, как создавать и использовать пакеты.
Наконец, мы рассмотрели, как скомпилировать и запустить приложение с пакетами с помощью команд javac
и java .
Полный код примера доступен на GitHub .