Java - Система Модулей

Введение в систему модулей Java

Привет, стремящиеся к java-программированию! Сегодня мы отправляемся в захватывающее путешествие в мир системы модулей Java. Как ваш добрый сосед-преподаватель информатики, я здесь, чтобы вести вас по этой увлекательной теме шаг за шагом. Не волнуйтесь, если вы новичок в программировании – мы начнем с основ и будем развиваться вместе!

Java - Module System

Что такое модуль?

Начнем с простой аналогии. Представьте, что вы строите замок из LEGO. Каждая LEGO-кирпичик представляет собой кусочек кода, а инструкции показывают, как их собирать. В Java модуль похож на предварительно собранный сегмент вашего замка – это коллекция связанных кодов, которые работают вместе для выполнения определенных функций.

Технически, модуль в Java – это автономная единица кода, которая включает:

  1. Классы и интерфейсы
  2. Ресурсы (например, изображения или файлы конфигурации)
  3. Ясное определение того, что он требует от других модулей
  4. Заявление о том, что он предоставляет другим модулям

Представьте это как хорошо организованную_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