Перейти к основному содержимому

Руководство по пакетам Java

· 5 мин. чтения

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

Наш вывод должен выглядеть так:

./00c0454e434426d47b2ab0ad1809bba5.jpg

6. Заключение

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

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

Наконец, мы рассмотрели, как скомпилировать и запустить приложение с пакетами с помощью команд javac и java .

Полный код примера доступен на GitHub .