Java - 模組系統

Java模組系統介紹

你好,有抱負的Java程式設計師!今天,我們將進入Java模組系統的精彩世界。作為你親切友善的電腦科學老師,我將引導你逐步了解這個迷人的主題。如果你是程式設計新手,也別擔心 - 我們將從基礎開始,一起逐步進階!

Java - Module System

模組是什麼?

讓我們從一個簡單的類比開始。想像你正在建造一座樂高城堡。每一塊樂高積木代表一段代碼,而說明書告訴你如何將它們組裝在一起。在Java中,模組就像是你城堡中預先建造的部分 - 它是一組相關的代碼,共同執行特定功能。

在技術術語中,Java中的模組是一個自包含的代碼單元,包含:

  1. 類別和介面
  2. 資源(如圖像或配置文件)
  3. 明確定義它需要從其他模組中獲得的內容
  4. 声明它為其他模組提供的內容

將其視為一個整齊有序的工具箱,每樣東西都有其位置和目的。

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模組表示它需要fridgestove模組才能正常工作。

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.greetingscom.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 "Hello, " + name + "!";
}
}

現在,讓我們創建使用我們greetings模組的com.myapp.main模組:

// 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 Modules"));
}
}

要編譯和運行此模組化應用程序,我們使用以下命令:

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