0Pricing
Java Academy · Урок

requires и exports

Управляйте зависимостями и видимостью

«requires и exports» — бесплатный урок Java Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Управление графом модулей

Граф модулей формируют две директивы: requires объявляет, от чего зависит модуль, а exports — какие сведения он раскрывает.

В этом уроке рассматриваются варианты этих директив и создаваемые ими правила читаемости и доступности.

Обычная зависимость

Простая запись requires X; означает: «этот модуль читает модуль X». Ваш код может использовать экспортируемые общедоступные типы X, но потребители вашего модуля ничего не узнают о X.

module com.example.app {
    requires java.sql;
}

Транзитивная зависимость

requires transitive Y; означает, что любой модуль, который читает ваш модуль, также читает Y. Это подразумеваемая читаемость, полезная, когда ваш программный интерфейс раскрывает типы Y.

module com.example.api {
    requires transitive java.sql;
}

Когда использовать транзитивную зависимость

Используйте transitive, когда метод вашего экспортируемого программного интерфейса возвращает тип из другого модуля или принимает такой тип. Иначе вызывающая сторона не сможет даже указать тип возвращаемого значения без собственной директивы requires.

Это избавляет потребителей от объявления избыточных зависимостей.

Статическая зависимость

requires static Z; объявляет зависимость, нужную только на этапе компиляции. Модуль необходим для компиляции, но необязателен во время выполнения, поэтому такой вариант отлично подходит для обработчиков аннотаций и необязательных интеграций.

module com.example.app {
    requires static com.example.annotations;
}

Обычное раскрытие

exports pkg; делает общедоступные типы pkg доступными для чтения всеми модулями, зависящими от вашего.

module com.example.lib {
    exports com.example.lib.api;
}

Квалифицированное раскрытие

Квалифицированное раскрытие открывает пакет только указанным именованным модулям с помощью записи exports pkg to modA, modB;. Это полезно для дружественных модулей в составе более крупной системы.

module com.example.core {
    exports com.example.core.internal to com.example.web, com.example.batch;
}

Открытие для отражения

exports предоставляет доступ к общедоступным членам во время компиляции и выполнения. Для глубокого отражения (закрытых полей) вместо этого требуется opens pkg;; такой подход используют фреймворки, например Jackson и Hibernate.

module com.example.model {
    exports com.example.model;
    opens com.example.model.entities to com.fasterxml.jackson.databind;
}

Открытые модули

Если всему модулю требуется доступ через отражение, что часто бывает с устаревшими фреймворками, объявите его как open. Тогда каждый пакет будет открыт для отражения, хотя обычные exports по-прежнему будут управлять доступом во время компиляции.

open module com.example.beans {
    requires java.logging;
}

Читаемость и доступность

Для использования типа из другого модуля должны одновременно выполняться два условия:

  • Читаемость: ваш модуль содержит requires для другого модуля
  • Доступность: другой модуль раскрывает пакет через exports, а тип является общедоступным

Если не выполняется хотя бы одно условие, компилятор отклонит ваш код.

Объединяем всё

Корректно оформленный модуль, который повторно раскрывает типы JDBC и открывает сущности для библиотеки JSON:

module com.example.service {
    requires transitive java.sql;
    requires static com.example.annotations;

    exports com.example.service.api;
    exports com.example.service.spi to com.example.plugins;
    opens com.example.service.dto to com.fasterxml.jackson.databind;
}

Быстрая проверка

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

Итоги

Вы изучили директивы зависимостей и видимости:

  • requires, requires transitive, requires static
  • exports и квалифицированное exports ... to
  • opens и open module для отражения
  • Для использования нужны и читаемость, и доступность

Далее: развязывание компонентов с помощью служб через директивы предоставления и использования.

Часто задаваемые вопросы

Урок «requires и exports» бесплатный?

Да — полный текст урока «requires и exports» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «requires и exports»?

Управляйте зависимостями и видимостью Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «requires и exports»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. module-info.java
  2. requires и exports
  3. Сервисы с provides/uses
  4. Переход на модули
← Назад к Java Academy