Створення модуля. Залежні модулі. Взаємодія між модулями
Створення модуля. Залежні модулі. Взаємодія між модулями
У Java модульна система була представлена з виходом Java 9 і стала важливим інструментом для організації та управління великими проектами. Модулі дозволяють структурувати програми, спрощувати управління залежностями і контролювати доступ до класів та пакетів. Модульна система вирішує проблеми “JAR hell”, такі як конфлікти версій і залежностей.
Основні поняття модульної системи:
- Модуль: Це одиниця коду, яка містить один або більше пакетів, і має чітко визначені межі, які дозволяють або забороняють доступ до певних класів або ресурсів.
- Декларація модуля: Кожен модуль має файл `module-info.java`, який описує, які пакети експортуються і які інші модулі використовуються.
Створення модуля в Java
Для створення модуля потрібно:
- Створити модульну структуру.
- Декларувати модуль у файлі `module-info.java`.
- Експортувати необхідні пакети та зазначити залежності від інших модулів.
Структура проєкту з модулями
Приклад структури проєкту з двома модулями: moduleA і moduleB.
/project
/src
/moduleA
/com/example/moduleA
– Main.java
– module-info.java
/moduleB
/com/example/moduleB
– Helper.java
– module-info.java
Створення модуля `moduleA`
Крок 1: Створення файлу `module-info.java`
Файл `module-info.java` розміщується в корені модуля і описує його структуру. Наприклад, для `moduleA`:
module moduleA {
requires moduleB; // Залежність від moduleB
exports com.example.moduleA; // Експортує пакет для використання в інших модулях
}
Крок 2: Написання класу в модулі `moduleA`
Клас `Main` в пакеті `com.example.moduleA` буде використовувати клас з `moduleB`:
package com.example.moduleA;
import com.example.moduleB.Helper;
public class Main {
public static void main(String[] args) {
Helper helper = new Helper();
helper.printMessage();
}
}
Створення модуля `moduleB`
Крок 1: Створення файлу `module-info.java`
module moduleB {
exports com.example.moduleB; // Дозволяє іншим модулям використовувати клас з цього пакета
}
Крок 2: Написання класу в модулі `moduleB`
Клас `Helper` в пакеті `com.example.moduleB`:
package com.example.moduleB;
public class Helper {
public void printMessage() {
System.out.println(“Hello from moduleB!”);
}
}
Залежності між модулями
У прикладі вище moduleA залежить від moduleB, що означає, що модуль `moduleA` може використовувати класи, які експортуються модулем `moduleB`. Це визначається за допомогою ключового слова `requires` в файлі `module-info.java`.
Ключові особливості залежностей:
- requires: Використовується для того, щоб оголосити залежність від іншого модуля. У прикладі `moduleA` оголошує, що він залежить від `moduleB`.
- transitive: Якщо модуль `A` залежить від модуля `B`, а `B` залежить від модуля `C`, то для того, щоб `A` міг також автоматично використовувати модуль `C`, модуль `B` може оголосити залежність як `requires transitive`. Це дозволяє не оголошувати залежність на модуль `C` у модулі `A`.Приклад:
module moduleB {
requires transitive moduleC;
exports com.example.moduleB;
}
Взаємодія між модулями
- Експортування пакетів: Щоб інші модулі могли використовувати певний код з модуля, потрібно експортувати пакети за допомогою ключового слова `exports`.- Якщо пакет не експортується, він залишається приватним і недоступним для інших модулів.
– Експорт конкретних пакетів робить модуль більш безпечним, контролюючи, які частини коду доступні зовні. - Використання модулів: Якщо модуль залежить від іншого модуля, він може використовувати лише ті класи, які знаходяться в експортованих пакетах. У прикладі вище, `moduleA` може використовувати клас `Helper` з пакета `com.example.moduleB`, тому що цей пакет експортується в файлі `module-info.java`.
Приклад модульної програми
1. moduleA:
module moduleA {
requires moduleB; // Залежить від moduleB
exports com.example.moduleA; // Експортує пакет com.example.moduleA
}
2. moduleB:
module moduleB {
exports com.example.moduleB; // Експортує пакет com.example.moduleB
}
3. Клас Main з moduleA:
package com.example.moduleA;
import com.example.moduleB.Helper;
public class Main {
public static void main(String[] args) {
Helper helper = new Helper();
helper.printMessage(); // Виклик методу з moduleB
}
}
4. Клас Helper з moduleB:
package com.example.moduleB;
public class Helper {
public void printMessage() {
System.out.println(“Hello from moduleB!”);
}
}
Переваги модульної системи:
- Ізоляція коду: Модулі дозволяють ізолювати різні частини програми, що робить її безпечнішою і легшою для підтримки.
- Управління залежностями: Завдяки декларативній системі залежностей (requires), можна легко керувати залежностями між частинами програми.
- Оптимізація: JVM може виконувати оптимізації, такі як завантаження лише необхідних модулів, що знижує витрати пам’яті та часу.
Висновок
Модульна система в Java дозволяє структурувати великі проекти на чітко визначені частини (модулі), які взаємодіють між собою через чітко описані інтерфейси. Завдяки використанню модулів можна уникати проблем із залежностями і забезпечити кращу ізоляцію та контроль доступу до коду.