Java - 模組系統
Java模組系統介紹
你好,有抱負的Java程式設計師!今天,我們將進入Java模組系統的精彩世界。作為你親切友善的電腦科學老師,我將引導你逐步了解這個迷人的主題。如果你是程式設計新手,也別擔心 - 我們將從基礎開始,一起逐步進階!
模組是什麼?
讓我們從一個簡單的類比開始。想像你正在建造一座樂高城堡。每一塊樂高積木代表一段代碼,而說明書告訴你如何將它們組裝在一起。在Java中,模組就像是你城堡中預先建造的部分 - 它是一組相關的代碼,共同執行特定功能。
在技術術語中,Java中的模組是一個自包含的代碼單元,包含:
- 類別和介面
- 資源(如圖像或配置文件)
- 明確定義它需要從其他模組中獲得的內容
- 声明它為其他模組提供的內容
將其視為一個整齊有序的工具箱,每樣東西都有其位置和目的。
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 "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