Java - Система Модулей
Введение в систему модулей Java
Привет, стремящиеся к java-программированию! Сегодня мы отправляемся в захватывающее путешествие в мир системы модулей Java. Как ваш добрый сосед-преподаватель информатики, я здесь, чтобы вести вас по этой увлекательной теме шаг за шагом. Не волнуйтесь, если вы новичок в программировании – мы начнем с основ и будем развиваться вместе!
Что такое модуль?
Начнем с простой аналогии. Представьте, что вы строите замок из LEGO. Каждая LEGO-кирпичик представляет собой кусочек кода, а инструкции показывают, как их собирать. В Java модуль похож на предварительно собранный сегмент вашего замка – это коллекция связанных кодов, которые работают вместе для выполнения определенных функций.
Технически, модуль в Java – это автономная единица кода, которая включает:
- Классы и интерфейсы
- Ресурсы (например, изображения или файлы конфигурации)
- Ясное определение того, что он требует от других модулей
- Заявление о том, что он предоставляет другим модулям
Представьте это как хорошо организованную_toolbox, где все имеет свое место и назначение.
Особенности системы модулей Java
Система модулей Java, введенная в Java 9, привносит несколько захватывающих функций. Рассмотрим их по порядку:
1. Сильная обертка
Помните, когда вы были ребенком и у вас была секретная коробка, где вы хранили свои сокровища? Модули работают аналогично. Они позволяют вам решать, какие части вашего кода видны другим, а какие являются вашими "секретными сокровищами".
module com.myapp.secretbox {
exports com.myapp.secretbox.api;
}
В этом примере только классы в пакете com.myapp.secretbox.api
видны другим модулям. Все остальное скрыто!
2. Надежная конфигурация
Модули четко указывают, что они требуют от других модулей. Это как создание списка покупок перед походом в продуктовый магазин – вы точно знаете, что вам нужно, и ничего не забудете!
module com.myapp.kitchen {
requires com.myapp.fridge;
requires com.myapp.stove;
}
Здесь наш модуль kitchen
указывает, что ему нужны модули fridge
и stove
для правильной работы.
3. Улучшенная производительность
С модулями Java может быть более умной по загрузке только необходимого кода. Это как упаковывать только те вещи, которые вы действительно наденете на поездку, а не весь гардероб!
Объявление модуля
Теперь, покроем рукава и создадим наш первый модуль. Начнем с создания файла module-info.java
в корне нашего каталога исходного кода.
module com.myapp.greetings {
exports com.myapp.greetings.api;
}
Это простое объявление создает модуль с именем com.myapp.greetings
и делает пакет com.myapp.greetings.api
доступным для других модулей.
Добавление зависимых модулей
Иногда наш модуль может потребовать использования кода из других модулей. Мы можем указать эти зависимости с помощью ключевого слова requires
.
module com.myapp.greetings {
requires com.myapp.translations;
exports com.myapp.greetings.api;
}
В этом примере наш модуль greetings
требует модуля translations
для правильной работы.
Добавление необязательных модулей
Что если у нас есть модуль, который хорошо использоваться, но не абсолютно необходим? Вот на что приходятся необязательные модули!
module com.myapp.greetings {
requires com.myapp.translations;
requires static com.myapp.fancyfonts;
exports com.myapp.greetings.api;
}
Ключевое слово static
указывает Java, что модуль fancyfonts
является необязательным. Наш модуль greetings
будет работать без него, но может использовать fancyfonts
, если он доступен.
Добавление транзитивных модулей
Иногда мы хотим передать наши зависимости модулям, которые зависят от нас. Мы можем сделать это с помощью ключевого слова transitive
.
module com.myapp.greetings {
requires transitive com.myapp.translations;
exports com.myapp.greetings.api;
}
Теперь любой модуль, который требует com.myapp.greetings
, автоматически получит доступ к com.myapp.translations
.
Экспорт публичных классов
Когда мы хотим сделать определенные пакеты доступными для других модулей, мы используем ключевое слово exports
.
module com.myapp.greetings {
exports com.myapp.greetings.api;
exports com.myapp.greetings.utils to com.myapp.testing;
}
В этом примере мы делаем пакет api
доступным для всех модулей, а пакет utils
только для модуля com.myapp.testing
.
Разрешение отражения
Иногда нам нужно разрешить другим модулям использовать отражение наших классов. Мы можем сделать это с помощью ключевого слова opens
.
module com.myapp.greetings {
exports com.myapp.greetings.api;
opens com.myapp.greetings.internal to com.myapp.testing;
}
Это позволяет модулю com.myapp.testing
использовать отражение на классы в пакете com.myapp.greetings.internal
.
Создание и использование Java-модулей
Теперь, когда мы покрыли основы, давайте создадим простую модульную приложение. Мы создадим два модуля: com.myapp.greetings
и com.myapp.main
.
Сначала создадим модуль com.myapp.greetings
:
// module-info.java
module com.myapp.greetings {
exports com.myapp.greetings;
}
// com/myapp/greetings/Greeter.java
package com.myapp.greetings;
public class Greeter {
public static String greet(String name) {
return "Привет, " + name + "!";
}
}
Теперь создадим модуль com.myapp.main
, который использует наш модуль greetings
:
// module-info.java
module com.myapp.main {
requires com.myapp.greetings;
}
// com/myapp/main/Main.java
package com.myapp.main;
import com.myapp.greetings.Greeter;
public class Main {
public static void main(String[] args) {
System.out.println(Greeter.greet("Java Модули"));
}
}
Чтобы скомпилировать и запустить это модульное приложение, используем следующие команды:
javac -d mods --module-source-path src $(find src -name "*.java")
java --module-path mods -m com.myapp.main/com.myapp.main.Main
И вот и все! Вы только что создали и запустили свое первое модульное приложение Java.
Заключение
Поздравляю с завершением этого введения в систему модулей Java! Мы покрыли большую территорию, от понимания того, что такое модули, до создания и использования их в реальном приложении. Помните, как и при обучении езде на велосипеде, освоение модулей требует практики. Не бойтесь экспериментировать и делать ошибки – именно так мы учимся лучше всего!
По мере вашего продвижения в мире Java, вы обнаружите, что модули помогают вам создавать более организованные, безопасные и эффективные приложения. Они как секретный ингредиент, который делает ваши навыки кодирования отличными.
Продолжайте программировать, учитесь и, что самое важное, наслаждайтесь процессом! До следующего раза, счастливого модулирования!
Credits: Image by storyset