Java - モジュールシステム
Javaモジュールシステム入門
こんにちは、Javaプログラマー志願者の皆さん!今日は、Javaのモジュールシステムのワクワクする世界に旅立ちましょう。あなたの親しみやすい近所のコンピューターサイエンスの先生として、私はあなたをこの興味深いトピックをステップバイステップに導いていきます。プログラミング初心者であっても心配しないでください - 基礎から始めて、一緒に上達していきましょう!
モジュールとは?
まず、簡単なアナロジーから始めましょう。レゴキャッスルを組み立てることを想像してみてください。各レゴブロックはコードの一部を表し、指示書はそれらをどのように組み合わせるかを教えています。Javaでは、モジュールはあなたのキャッスルの事前に組み立てられたセクションのように、特定の機能を果たすために関連するコードのコレクションです。
技術的な言葉では、Javaのモジュールは以下を含む自己完結したコード単位です:
- クラスとインターフェース
- リソース(画像や設定ファイルなど)
- 他のモジュールから必要なものの明確な定義
- 他のモジュールに提供するものの宣言
それぞれがその場所と目的を持つように整理された道具箱のように考えてください。
Javaモジュールシステムの特徴
Java 9で導入されたJavaモジュールシステムは、いくつかの魅力的な機能を提供しています。それぞれを見ていきましょう:
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
キーワードは、fancyfonts
モジュールがオプションであることをJavaに伝えます。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
の2つのモジュールを作成します。
まず、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 + "!";
}
}
次に、com.myapp.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