Створення модуля. Залежні модулі. Взаємодія між модулями

Прокрутити вниз

Створення модуля. Залежні модулі. Взаємодія між модулями
У Java модульна система була представлена з виходом Java 9 і стала важливим інструментом для організації та управління великими проектами. Модулі дозволяють структурувати програми, спрощувати управління залежностями і контролювати доступ до класів та пакетів. Модульна система вирішує проблеми “JAR hell”, такі як конфлікти версій і залежностей.

Основні поняття модульної системи:

  • Модуль: Це одиниця коду, яка містить один або більше пакетів, і має чітко визначені межі, які дозволяють або забороняють доступ до певних класів або ресурсів.
  • Декларація модуля: Кожен модуль має файл `module-info.java`, який описує, які пакети експортуються і які інші модулі використовуються.

Створення модуля в Java

Для створення модуля потрібно:

  1. Створити модульну структуру.
  2. Декларувати модуль у файлі `module-info.java`.
  3. Експортувати необхідні пакети та зазначити залежності від інших модулів.

Структура проєкту з модулями

Приклад структури проєкту з двома модулями: 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`.

Ключові особливості залежностей:

  1. requires: Використовується для того, щоб оголосити залежність від іншого модуля. У прикладі `moduleA` оголошує, що він залежить від `moduleB`.
  2. transitive: Якщо модуль `A` залежить від модуля `B`, а `B` залежить від модуля `C`, то для того, щоб `A` міг також автоматично використовувати модуль `C`, модуль `B` може оголосити залежність як `requires transitive`. Це дозволяє не оголошувати залежність на модуль `C` у модулі `A`.Приклад:
    module moduleB {
    requires transitive moduleC;
    exports com.example.moduleB;
    }

Взаємодія між модулями

  1. Експортування пакетів: Щоб інші модулі могли використовувати певний код з модуля, потрібно експортувати пакети за допомогою ключового слова `exports`.- Якщо пакет не експортується, він залишається приватним і недоступним для інших модулів.
    – Експорт конкретних пакетів робить модуль більш безпечним, контролюючи, які частини коду доступні зовні.
  2. Використання модулів: Якщо модуль залежить від іншого модуля, він може використовувати лише ті класи, які знаходяться в експортованих пакетах. У прикладі вище, `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 дозволяє структурувати великі проекти на чітко визначені частини (модулі), які взаємодіють між собою через чітко описані інтерфейси. Завдяки використанню модулів можна уникати проблем із залежностями і забезпечити кращу ізоляцію та контроль доступу до коду.

Створення модуляЗалежні модуліВзаємодія між модулями