Рубрики
Без рубрики

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

Узнайте больше о пакетах на Java

Автор оригинала: baeldung.

1. введение

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

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

Наконец, мы скомпилируем и запустим наши упакованные классы Java.

2. Обзор пакетов Java

В Java мы используем пакеты для группировки связанных классов, интерфейсов и подпакетов .

Основными преимуществами этого являются:

  • Упрощение поиска связанных типов – пакеты обычно содержат логически связанные типы
  • Избегая конфликтов имен – пакет поможет нам однозначно идентифицировать класс; например, у нас может быть com.baeldung.Приложение, а также com.пример.Применение классы
  • Контроль доступа – мы можем контролировать видимость и доступ к типам, комбинируя пакеты и модификаторы доступа

Далее давайте посмотрим, как мы можем создавать и использовать Java-пакеты.

3. Создание пакета

Чтобы создать пакет, мы должны использовать оператор package , добавив его в качестве самой первой строки кода в файле .

Давайте поместим тип в пакет с именем com.baeldung.packages :

package com.baeldung.packages;

Настоятельно рекомендуется помещать каждый новый тип в пакет. Если мы определяем типы и не помещаем их в пакет, они будут отправлены в default или безымянный пакет. Использование пакетов по умолчанию имеет несколько недостатков:

  • Мы теряем преимущества наличия пакетной структуры и не можем иметь субпакеты
  • Мы не можем импортировать типы в пакете по умолчанию из других пакетов
  • Области доступа protected и package-private были бы бессмысленны

Как говорится в спецификации языка Java , безымянные пакеты предоставляются платформой Java SE главным образом для удобства при разработке небольших или временных приложений или при только начинающейся разработке.

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

3.1. Соглашения об именовании

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

  • мы определяем наши имена пакетов во всех строчных буквах
  • имена пакетов разделены точкой
  • имена также определяются компанией или организацией, которая их создает

Чтобы определить имя пакета на основе организации, мы обычно начинаем с реверсирования URL-адреса компании. После этого соглашение об именовании определяется компанией и может включать названия подразделений и названия проектов.

Например, чтобы сделать пакет из www.baeldung.com , давайте перевернем его:

com.baeldung

Затем мы можем дополнительно определить подпакеты этого типа, такие как com.baeldung.packages или com.baeldung.packages.domain.

3.2. Структура каталогов

Пакеты в Java соответствуют структуре каталогов.

Каждый пакет и подпакет имеет свой собственный каталог. Итак, для пакета com.baeldung.packages мы должны иметь структуру каталогов com -> baeldung -> packages .

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

4. Использование Членов Пакета

Начнем с определения класса TodoItem в подпакете с именем domain :

package com.baeldung.packages.domain;

public class TodoItem {
    private Long id;
    private String description;
    
    // standard getters and setters
}

4.1. Импорт

Чтобы использовать наш класс TodoItem из класса в другом пакете, нам нужно импортировать его. Как только он будет импортирован, мы сможем получить к нему доступ по имени.

Мы можем импортировать один тип из пакета или использовать звездочку для импорта всех типов в пакете.

Давайте импортируем весь домен подпакет:

import com.baeldung.packages.domain.*;

Теперь давайте импортируем только класс TodoItem :

import com.baeldung.packages.domain.TodoItem;

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

Например, давайте импортируем Java core List interface и ArrayList class:

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 of TodoItems.

4.2. Полное Наименование

Иногда мы можем использовать два класса с одинаковым именем из разных пакетов. Например, мы можем использовать как java.sql.Date , так и java.util.Дата . Когда мы сталкиваемся с конфликтами именования, нам нужно использовать полное имя класса хотя бы для одного из классов.

Давайте использовать To do Item с полным именем:

public class TodoList {
    private List todoItems;

    public void addTodoItem(com.baeldung.packages.domain.TodoItem todoItem) {
        if (todoItems == null) {
            todoItems = new ArrayList();
        }todoItems.add(todoItem);
    }

    // standard getters and setters
}

5. Компиляция с помощью javac

Когда приходит время компилировать наши упакованные классы, мы должны помнить нашу структуру каталогов. Начиная с исходной папки, мы должны сказать javac , где найти наши файлы.

Сначала нам нужно скомпилировать наш класс TodoItem , потому что наш класс ToDoList зависит от него.

Давайте начнем с открытия командной строки или терминала и перехода в наш исходный каталог.

Теперь давайте скомпилируем наш com.baeldung.packages.domain.TodoItem класс:

> javac com/baeldung/packages/domain/TodoItem.java

Если ваш класс компилируется чисто, мы не увидим никаких сообщений об ошибках и файл TodoItem.class должен появиться в нашем каталоге com/baeldung/packages/domain .

Для типов, которые ссылаются на типы в других пакетах, мы должны использовать флаг -classpath , чтобы сообщить команде javac , где найти другие скомпилированные классы.

Теперь, когда наш класс TodoItem скомпилирован, мы можем скомпилировать наши классы ToDoList и TodoApp :

>javac -classpath . com/baeldung/packages/*.java

Опять же, мы не должны видеть никаких сообщений об ошибках, и мы должны найти два файла класса в нашем каталоге com/baeldung/packages .

Давайте запустим наше приложение, используя полное имя нашего класса TodoApp :

>java com.baeldung.packages.TodoApp

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