Руководство по пакетам Java
1. Вступление
В этом кратком руководстве мы рассмотрим основы работы с пакетами на Java. Мы увидим, как создавать пакеты и получать доступ к типам, которые мы помещаем в них.
Мы также обсудим соглашения об именах и их связь с базовой структурой каталогов.
Наконец, мы скомпилируем и запустим наши упакованные классы Java.
2. Обзор пакетов Java
В Java мыuse packages to group related classes, interfaces and sub-packages.
Основными преимуществами этого являются:
-
Упрощение поиска связанных типов - пакеты обычно содержат типы, которые логически связаны
-
Избежание конфликтов именования - пакет поможет нам однозначно идентифицировать класс; например, мы могли бы иметь классыcom.example.Application,, а такжеcom.example.Application
-
Управление доступом - мы можем контролировать видимость и доступ к типам, комбинируя пакеты иaccess modifiers
Затем давайте посмотрим, как мы можем создавать и использовать пакеты Java.
3. Создание пакета
Чтобы создать пакет,we have to use the package statement by adding it as the very first line of code in a file.
Поместим тип в пакет с именемcom.example.packages:
package com.example.packages;
It’s highly recommended to add each new type in a package. Если мы определяем типы и не помещаем их в пакет, они попадут вdefault или в безымянный пакет. При этом мы теряем преимущества использования структуры пакета и не будем получать доступ к этим типам из других пакетов.
3.1. Соглашения об именах
Чтобы избежать пакетов с одинаковым именем, мы придерживаемся некоторых соглашений об именах:
-
мы определяем наш пакетnames in all lower case
-
имена пакетов разделены точкой
-
имена также определяютсяthe company or organization that creates them
Чтобы определить название пакета на основе организации, мы обычно начинаем с изменения URL-адреса компании. После этого соглашение об именах определяется компанией и может включать названия подразделений и проектов.
Например, чтобы сделать пакет изwww.example.com, давайте перевернем его:
com.example
Затем мы можем дополнительно определить подпакеты этого, напримерcom.example.packages илиcom.example.packages.domain.
3.2. Структура каталогов
Пакеты в Java соответствуют структуре каталогов.
Each package and subpackage has its own directory. Итак, для пакетаcom.example.packages у нас должна быть структура каталоговcom → example → packages.
Большинство IDE помогут создать эту структуру каталогов на основе имен наших пакетов, поэтому нам не нужно создавать их вручную.
4. Использование членов пакета
Начнем с определения классаTodoItem в подпакете с именемdomain:
package com.example.packages.domain;
public class TodoItem {
private Long id;
private String description;
// standard getters and setters
}
4.1. импорт
Чтобы использовать наш классTodoItem из класса в другом пакете, нам нужно его импортировать. После импорта мы можем получить к нему доступ по имени.
Мы можем импортировать один тип из пакета или использовать звездочку для импорта всех типов в пакете.
Давайте импортируем весь подпакетdomain:
import com.example.packages.domain.*;
Теперь давайте импортируем только классTodoItem:
import com.example.packages.domain.TodoItem;
JDK и другие библиотеки Java также поставляются со своими собственными пакетами. We can import pre-existing classes that we want to use in our project in the same manner.с
Например, давайте импортируем интерфейс ядра JavaList и классArrayList:
import java.util.ArrayList;import java.util.List;
Затем мы можем использовать эти типы в нашем приложении, просто используя их имя:
public class TodoList {
private List todoItems;
public void addTodoItem(TodoItem todoItem) {
if (todoItems == null) {
todoItems = new ArrayList();
}
todoItems.add(todoItem);
}
}
Здесь мы использовали наши новые классы вместе с базовыми классами Java, чтобы создатьList изToDoItems.
4.2. Полностью квалифицированное имя
Иногда мы можем использовать два класса с одинаковыми именами из разных пакетов. Например, мы можем использовать какjava.sql.Date, так иjava.util.Date. When we run into naming conflicts, we need to use a fully qualified class name for at least one of the classes.
Давайте использоватьTodoItem с полным именем:
public class TodoList {
private List todoItems;
public void addTodoItem(com.example.packages.domain.TodoItem todoItem) {
if (todoItems == null) {
todoItems = new ArrayList();
}todoItems.add(todoItem);
}
// standard getters and setters
}
5. Компиляция сjavac
Когда пришло время скомпилировать наши упакованные классы, нам нужно вспомнить нашу структуру каталогов. Начиная с исходной папки, нам нужно указатьjavac, где найти наши файлы.
Нам нужно сначала скомпилировать наш классTodoItem, потому что наш классTodoList зависит от него.
Давайте начнем с открытия командной строки или терминала и перехода в наш исходный каталог.
Теперь давайте скомпилируем наш классcom.example.packages.domain.TodoItem:
> javac com/example/packages/domain/TodoItem.java
Если наш класс компилируется правильно, мы не увидим сообщений об ошибках и в нашем каталогеcom/example/packages/domain должен появиться файлTodoItem.class.
Для типов, которые ссылаются на типы в других пакетах, мы должны использовать флаг-classpath, чтобы указать командеjavac, где найти другие скомпилированные классы.
Теперь, когда наш классTodoItem скомпилирован, мы можем скомпилировать наши классыTodoList иTodoApp:
>javac -classpath . com/example/packages/*.java
Опять же, мы не должны видеть сообщений об ошибках и должны найти два файла классов в нашем каталогеcom/example/packages.
Давайте запустим наше приложение, используя полное имя нашего классаTodoApp:
>java com.example.packages.TodoApp
Наш вывод должен выглядеть так:
6. Заключение
В этой короткой статье мы узнали, что такое пакет и почему мы должны его использовать.
Мы обсудили соглашения об именах и то, как пакеты связаны со структурой каталогов. Мы также увидели, как создавать и использовать пакеты.
Наконец, мы рассмотрели, как скомпилировать и запустить приложение с пакетами, используя командыjavac иjava.
Полный пример кода доступенover on GitHub.